企业级Apache双向认证必须同时配置SSLCACertificateFile、SSLVerifyClient require和SSLVerifyDepth三者,缺一不可;需按Location或Directory路径精细化启用,配合OCSP/CRL吊销检查及后端透传校验,否则将导致500错误或安全失效。

要让 Apache 在核心层真正启用企业级客户端证书双向认证,关键不是只写 SSLVerifyClient require,而是构建一套完整、可信、可审计的验证链。单独设置该指令反而会导致 500 错误,因为服务端根本不知道该信任谁。
必须配齐三项基础指令
Apache 不会自动推导信任关系,以下三者缺一不可:
-
SSLCACertificateFile:指向包含根 CA 和/或中间 CA 证书的 PEM 文件(不能含私钥、不能有空行或多余字符),权限设为
600,属主为运行 Apache 的用户(如www-data) -
SSLVerifyClient require:强制客户端在 TLS 握手阶段提供证书;设为
optional或optional_no_ca都不满足企业级要求 -
SSLVerifyDepth:明确指定证书链最大深度(如
2表示根 CA → 中间 CA → 客户端证书),防止恶意构造超长链攻击
避免全局启用,按路径精细化控制
把 SSLVerifyClient require 放在 顶层,会让所有请求(包括 CSS、JS、图片)都强制验签,既拖慢性能,又导致浏览器因不自动发送证书而返回 403。正确做法是限定业务入口:
- 在
或块中启用 - 搭配
SSLRequireSSL确保仅 HTTPS 下生效 - 现代 Apache(2.4.8+)应使用
Require ssl-verify-client替代已废弃的SSLRequire
启用吊销检查,补齐企业级安全闭环
仅验证签名和有效期不够——证书可能已被主动吊销。企业场景必须启用实时状态校验:
- 配置
SSLCARevocationPath或SSLCARevocationFile指向 CRL 文件(需定期更新) - 更推荐 OCSP:添加
SSLUseStapling on+SSLStaplingCache,由服务器主动查询并缓存 OCSP 响应 - 验证失败时,Apache 默认返回 403;可通过
ErrorDocument 403自定义提示,但不可跳过检查
透传与校验客户端身份信息
证书通过后,Apache 会注入一系列环境变量,供后端应用进一步鉴权:
-
%{SSL_CLIENT_S_DN_CN}、%{SSL_CLIENT_S_DN_OU}可用于匹配预设白名单(如OU=Finance) - 用
RequestHeader set X-Client-CN "%{SSL_CLIENT_S_DN_CN}s"将字段透传给后端服务 - 务必校验
%{SSL_CLIENT_VERIFY}值是否为SUCCESS,防止绕过











