SSLUserName SSL_CLIENT_S_DN_CN可直接映射证书CN为用户名,但必须启用SSLVerifyClient require、SSLOptions +StdEnvVars和SSLRequireSSL,且仅支持预定义变量,不支持拼接或正则提取。

直接用 SSLUserName SSL_CLIENT_S_DN_CN 即可将客户端证书的 Common Name 导出为用户名,但必须满足几个硬性前提,否则变量始终为空或不生效。
必须启用双向认证和环境变量透传
SSLUserName 不是独立生效的指令,它依赖 TLS 握手完成后的证书解析结果:
- SSLVerifyClient require:必须在对应 VirtualHost 或 Directory 块中启用,强制客户端提供并验证证书;设为 optional 或 off 会导致 SSL_CLIENT_S_DN_CN 为空
- SSLOptions +StdEnvVars:Apache 2.4 默认不导出 SSL 环境变量,需显式开启,否则 PHP/CGI 读不到 SSL_CLIENT_S_DN_CN
- SSLRequireSSL:确保该路径只走 HTTPS,避免明文传输时变量被绕过或误用
可用的证书字段变量及注意事项
SSLUserName 只接受 Apache 内置的预定义变量,不能拼接、不能正则提取:
- SSL_CLIENT_S_DN_CN:最常用,对应证书 Subject 中的 CN 字段;注意 CA 可能填邮箱、UUID 或完整 DN,不可直接当作可信用户名
- SSL_CLIENT_S_DN_Email:仅当证书 CSR 显式包含 emailAddress 扩展字段才非空;自签名或私有 CA 需在签发时加入
- SSL_CLIENT_S_DN_UID:LDAP 场景常用,需 CA 在签发时嵌入,公网证书通常不含
- 所有 SSL_CLIENT_S_DN_* 值默认 URL 编码(空格变 +,@ 变 %40),后端应用需自行解码才能正确比对
典型配置示例
以下片段放在 VirtualHost 或 Directory 块内即可生效:
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /path/to/server.crt
SSLCertificateKeyFile /path/to/server.key
SSLCACertificateFile /path/to/ca.crt
<pre class='brush:php;toolbar:false;'>SSLVerifyClient require
SSLVerifyDepth 2
SSLUserName SSL_CLIENT_S_DN_CN
SSLOptions +StdEnvVars
<Directory "/var/www/html">
Require all granted
</Directory></VirtualHost>
配置后,PHP 中可通过 $_SERVER['SSL_CLIENT_S_DN_CN'] 读取,CGI 程序通过环境变量获取。若值为空,优先排查客户端是否发送了证书、CA 文件路径是否正确、私钥权限是否为 600。


















