SSLVerifyClient require 必须配合 SSLCACertificateFile 使用,否则因缺失可信CA列表导致500错误;optional_no_ca跳过CA加载但不校验签名,仅用于调试;企业级双向认证须用require并启用CRL或OCSP吊销检查。

SSLVerifyClient 为什么必须配合 SSLCACertificateFile 使用
单独设置 SSLVerifyClient require 不会触发双向认证,Apache 会直接返回 500 错误并记录 SSL Library Error: error:140890C7:SSL routines:ssl3_get_client_certificate:peer did not return a certificate。根本原因是服务端没有可信 CA 列表,无法验证客户端证书签名。
必须同时指定 SSLCACertificateFile(或 SSLCACertificatePath),指向包含客户端根证书或中间证书的 PEM 文件。该文件不能是私钥,也不能混入非证书内容(如注释、空行、base64 尾部的 -----END CERTIFICATE----- 之后还有数据)。
- 推荐用单个 PEM 文件,避免路径扫描开销;多个证书可追加拼接,顺序无关
- 文件权限需为 600,且属主为运行 Apache 的用户(如
www-data或apache) - 修改后必须执行
apachectl configtest,否则 reload 可能静默失败
SSLVerifyClient optional_no_ca 和 require 的实际行为差异
SSLVerifyClient optional_no_ca 并不跳过验证,而是跳过「查找并加载 CA 证书」这一步——它仍会接收客户端证书,但不校验签名有效性,只检查格式和有效期。这在调试阶段有用,但绝不能用于生产环境。
SSLVerifyClient require 是唯一满足企业级双向认证要求的选项:客户端必须提供有效证书,且该证书必须能被 SSLCACertificateFile 中的 CA 链成功验证(包括吊销检查,若配置了 OCSP 或 CRL)。
- 不要用
optional:它允许无证书请求通过,形同未启用双向认证 -
optional_no_ca下%{SSL_CLIENT_S_DN}等变量可能为空或不可信,不能用于权限判断 - 企业场景中,所有业务路径都应统一使用
require,并在应用层进一步校验SSL_CLIENT_I_DN或扩展字段
如何在 Location 或 Directory 中精细化控制双向认证范围
全局启用 SSLVerifyClient require 会导致静态资源(如 CSS/JS)也强制验签,既增加 TLS 握手延迟,又容易因浏览器不自动发送证书导致 403。正确做法是在具体业务路径下启用:
Location /api/v2/
SSLVerifyClient require
SSLRequireSSL
# 允许特定 OU 或 CN 访问
SSLRequire %{SSL_CLIENT_S_DN_OU} eq "Engineering" and %{SSL_CLIENT_S_DN_CN} =~ /^svc-.*$/
注意:SSLRequire 已废弃,现代 Apache(2.4.8+)应改用 Require 表达式:
Location /api/v2/
SSLVerifyClient require
SSLRequireSSL
Require expr %{SSL_CLIENT_S_DN_OU} == 'Engineering'
Require expr %{SSL_CLIENT_S_DN_CN} =~ /^svc-.*$/
- 避免在
VirtualHost级别设SSLVerifyClient,除非所有路径都需要 -
SSLRequireSSL必须开启,防止 HTTP 回退绕过证书校验 - 表达式中的 DN 字段名(如
O,OU,CN)区分大小写,且需与客户端证书实际字段完全一致
客户端证书吊销检查的两个关键配置点
仅验证签名和有效期远远不够。企业环境中必须确认证书未被 CA 吊销,否则攻击者利用泄露私钥仍可登录。Apache 本身不内置 CRL/OCSP 客户端,依赖 OpenSSL 底层能力:
- 启用 CRL 检查:在
SSLCACertificateFile同目录下放置crl.pem,并在配置中添加SSLCARevocationFile /path/to/crl.pem;还需确保 CRL 文件定期更新(手动或 cron +openssl ca -gencrl) - OCSP 更实时:添加
SSLUseStapling on并配置SSLStaplingCache,但要求客户端支持 OCSP Stapling(现代浏览器均支持),且服务端能连通 CA 的 OCSP 响应器 - 无论选哪种,都需在
SSLCertificateFile对应的证书中包含authorityInfoAccess扩展(即 AIA 字段),否则 OpenSSL 不知道去哪查
漏掉吊销检查,等于把门锁换成了透明玻璃——看着结实,一捅就破。

















