可通过$ssl_client_s_dn变量将客户端证书subject dn写入nginx日志实现身份审计,需启用ssl_verify_client并配置ca证书、自定义log_format及access_log,dn字段需引号包裹并建议提取cn等关键标识用于分析。

可以通过 $ssl_client_s_dn 变量将客户端证书的可分辨名称(Subject DN)写入 Nginx 访问日志,从而实现基于证书身份的访问审计。关键在于确保 TLS 握手时已启用客户端证书验证,并正确配置日志格式。
确认客户端证书已启用并成功验证
该变量仅在启用 ssl_verify_client 且客户端成功提供有效证书时才有值。若未开启验证或验证失败,变量为空字符串。
- 在 server 块中设置
ssl_verify_client on;或ssl_verify_client optional; - 配置受信任的 CA 证书:
ssl_client_certificate /path/to/ca-bundle.pem; - 推荐使用
optional模式便于调试,再根据实际需求切换为on
定义含 $ssl_client_s_dn 的自定义日志格式
直接在 log_format 中引用该变量,建议同时记录其他关键字段以增强可追溯性。
- 示例格式:
log_format cert_audit '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$ssl_client_s_dn" "$ssl_client_i_dn"'; -
$ssl_client_s_dn是客户端证书 Subject 字段(如CN=user1,OU=Dev,O=Org,L=Beijing,ST=Beijing,C=CN) -
$ssl_client_i_dn是签发者证书 Subject,可用于溯源 CA 层级
在 location 或 server 中启用该日志格式
指定 access_log 使用自定义格式,并确保日志路径有写入权限。
- 例如:
access_log /var/log/nginx/client-cert-access.log cert_audit; - 若只对特定路径审计(如 /api/),可将该配置放在对应
location块内 - 注意:日志中 DN 字符串含逗号、等号和空格,建议用双引号包裹(已在 log_format 中体现)
解析与使用日志中的 DN 字段
日志中的 DN 是字符串,需提取关键标识(如 CN、UID、email)用于分析或关联用户系统。
- 可用 awk/sed 提取 CN:
awk -F'"' '{gsub(/ /,"",$6); print $6}' client-cert-access.log | grep -o 'CN=[^,]*' - 更可靠的方式是用工具(如 OpenSSL 或 Python 的 cryptography 库)解析原始证书,但日志中 DN 已足够用于常规审计比对
- 注意:DN 不唯一(不同用户可能有相同 CN),生产环境建议要求证书包含唯一字段(如
UID或serialNumber),并在日志中一并记录(需通过$ssl_client_cert解析,较复杂)











