apache实现企业级mtls需同时配置sslcacertificatefile、sslverifyclient require和sslverifydepth,缺一不可;否则将报500错误,日志显示peer did not return a certificate。

要在 Apache 中通过 mod_ssl 实现企业级双向证书认证(mTLS),关键不是仅设置 SSLVerifyClient,而是构建完整、可信、可审计的身份验证链。核心在于“强制验签 + 可信锚点 + 业务透传”三者缺一不可。
必须配齐三项基础指令,缺一不可
单独写 SSLVerifyClient require 会导致 500 错误,Apache 日志中会出现 ssl3_get_client_certificate: peer did not return a certificate。真正起效需同时配置:
- SSLCACertificateFile:指定 PEM 格式的根 CA 或中间 CA 证书文件(不能含私钥,不能有空行或多余字符),Apache 用它验证客户端证书签名;
-
SSLVerifyClient require:强制客户端在 TLS 握手时提交有效证书,缺失或验证失败即拒接(
optional和optional_no_ca不满足企业要求); -
SSLVerifyDepth:设为实际证书链层级(如根 CA → 中间 CA → 客户端证书,则填
2),防止深度过长引发拒绝服务。
只在业务路径启用,避免静态资源阻塞
全局开启 SSLVerifyClient require 会让 CSS/JS 等资源也触发证书弹窗,浏览器通常不自动发送证书,导致页面加载失败或 403。应精准控制范围:
- 在
<location></location>或<directory></directory>块内配置上述三项指令; - 静态资源目录(如
/static)保持默认单向 HTTPS,不启用客户端验证; - 配合
ErrorDocument 403 "Valid client certificate required"提供明确提示。
将证书身份安全透传给后端应用
Apache 验证通过后,会把客户端证书信息注入环境变量,但默认不转发到后端。需主动透传用于业务鉴权:
- 启用
RequestHeader set X-Client-DN "%{SSL_CLIENT_S_DN}s"和X-Client-Verify "%{SSL_CLIENT_VERIFY}s"; - 若后端是 Java(如 Tomcat),确保 Apache 启用
SSLProxyEngine On并配置SSLProxyVerify require; - 业务层必须校验
X-Client-Verify == SUCCESS,再解析X-Client-DN中的CN或扩展字段(如subjectAltName)做权限匹配,不可仅依赖 CN 字符串。
企业级加固要点
合规场景(如金融、政务)还需补充以下配置:
- 启用 OCSP 或 CRL 吊销检查:
SSLUseStapling on+SSLStaplingCache shmcb:/path/stapling(128000); - 禁用老旧协议:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1; - 限定高强度密码套件:
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; - CA 证书文件权限设为
600,属主为 Apache 运行用户(如www-data); - 每次修改后执行
apachectl configtest,确认无语法错误再 reload。











