Apache企业级双向认证需闭环配置SSLCACertificateFile、SSLVerifyClient require和SSLVerifyDepth三要素,缺一不可;必须在路径下精准启用,透传X-Client-CN等头供后端校验,并启用OCSP或CRL吊销检查。

要在Apache中实现企业级内部办公系统的双向证书认证,核心不是简单开启SSLVerifyClient,而是构建一条完整、可控、可审计的信任与控制链。内部办公场景的特点是客户端固定(如员工终端、OA客户端、HR系统)、证书可统一签发、不面向公网,这反而让双向认证更易落地、更值得信赖。
必须配齐的三项基础配置
缺一不可,否则会直接返回500错误或验证失效:
-
SSLCACertificateFile:指定你自建根CA或中间CA的PEM文件(如
/etc/apache2/ssl/internal-ca.crt),只含证书,不含私钥、注释或空行;权限设为600,属主为www-data或apache -
SSLVerifyClient require:唯一生产可用选项;
optional形同未启用,optional_no_ca跳过签名验证,仅调试用 - SSLVerifyDepth:明确证书链深度(如设为2,表示根CA → 中间CA → 客户端证书),防止恶意构造超长链攻击
精准控制启用范围,避免误伤静态资源
全局启用会导致CSS、JS、图片等请求全部强制验签,浏览器通常不自动发送客户端证书,结果大量403错误。应严格限定在业务路径下:
- 在
或块中启用,而非顶层 - 搭配
SSLRequireSSL确保仅HTTPS下生效 - 若需按组织单位初筛,用现代
Require expr语法:Require expr %{SSL_CLIENT_S_DN_OU} == 'HR' && %{SSL_CLIENT_VERIFY} == 'SUCCESS'(Apache 2.4.8+)
透传身份信息供后端真正鉴权
Apache完成TLS层校验后,默认不把证书内容传给PHP/Java/Python等后端应用。必须显式注入:
- 启用环境变量导出:
SSLOptions +StdEnvVars +ExportCertData - 透传关键字段到HTTP头:
RequestHeader set X-Client-CN "%{SSL_CLIENT_S_DN_CN}s"<br> RequestHeader set X-Client-OU "%{SSL_CLIENT_S_DN_OU}s"<br> RequestHeader set X-SSL-Verify "%{SSL_CLIENT_VERIFY}s" - 后端必须校验
X-SSL-Verify值是否为SUCCESS,不能只信任头字段本身
补全吊销检查,形成安全闭环
仅验证签名和有效期不够——证书可能已被主动吊销。企业办公必须启用实时状态校验:
- 推荐OCSP Stapling:
SSLUseStapling on+SSLStaplingCache shmcb:/var/run/ocsp(128000) - 或使用CRL:
SSLCARevocationFile /etc/apache2/ssl/crl.pem(需定期更新) - 验证失败时默认返回403,可用
ErrorDocument 403定制提示,但不可绕过检查











