开启 Nginx 国密 SSL证书 握手的调试日志,主要是通过 error_log 指令设置 `debug` 级别来完成的。但在此之前,需要先确认 Nginx 已正确配置了国密支持。
一、前置环境:Nginx 国密支持配置
支持国密需要 Nginx 配合特定的国密库(如 GmSSL 或 OpenSSL 3.0+ 国密 Provider)重新编译,常见的方案包括 Tengine + gmssl 补丁或 OpenResty-gm 分支。为确保 Nginx 已包含国密支持,可通过 `nginx -V 2>&1 | grep -o with-debug` 检查编译参数是否包含 `--with-debug`。
二、核心配置:开启 `debug` 日志级别
按照以下步骤在 Nginx 中配置国密 SSL 调试日志:
1. 打开配置文件:使用编辑器打开 Nginx 配置文件,通常是 `/etc/nginx/nginx.conf` 或在 `/etc/nginx/sites-available/` 下的对应站点配置文件。
2. 配置错误日志 (error_log):找到需要调试的 `server` 或 `http` 配置块,添加或修改以下指令:
nginx
server {
# 确保监听 SSL
listen 443 ssl;
# ... 其他配置
# 关键:设置错误日志级别为 debug,并指定路径
error_log /var/log/nginx/ssl_error.log debug;
# ... 其他 SSL 相关配置
}
设置为 `debug` 会记录非常详细的信息,包括完整的 SSL/TLS 握手过程。`debug` 日志会记录类似 `SSL_do_handshake() failed` 的握手失败信息及其 OpenSSL 错误详情,帮助你定位是密码套件不匹配、TLS 版本问题还是证书链问题。
3. 配置访问日志 (access_log):同时配置访问日志可以记录协商成功的 TLS 信息:
```nginx
http {
# 在 http 块中定义日志格式
log_format tls_detail '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$ssl_protocol" "$ssl_cipher" "$ssl_server_name"';
server {
# 应用日志格式
access_log /var/log/nginx/access_tls.log tls_detail;
# ...
}
}
访问日志会附带实际协商成功的 TLS 协议版本 (`$ssl_protocol`) 和密码套件 (`$ssl_cipher`),可用于验证国密算法是否真正生效。国密成功连接后,`access_tls.log` 中的 `$ssl_protocol` 字段会显示为 `GMSSLv1.2`。
4. 重启 Nginx:保存配置后,执行 `sudo nginx -s reload` 重新加载配置。
三、验证方法
配置生效后,可以通过以下方式获取日志内容:
实时监控:使用 `tail -f /var/log/nginx/ssl_error.log` 和 `tail -f /var/log/nginx/access_tls.log` 实时查看新日志。
使用 `openssl s_client`:模拟国密客户端连接,并检查服务端日志输出。
bash
# 使用 gmssl 工具(非官方 OpenSSL)
gmssl s_client -connect your_domain.com:443 -cipher ECC-SM2-SM4-CBC-SM3
如果连接成功,服务端的 `access_tls.log` 会记录下与国密相关的 `$ssl_cipher` 值。
四、常见问题与进阶技巧
问题 可能原因 调试与解决方案
未生成 debug 日志 Nginx 编译时未开启 `--with-debug` 选项。 通过 `nginx -V 2>&1 grep debug` 确认,若无输出则需重新编译。
国密握手失败 密码套件配置错误或客户端不支持国密。 检查 `ssl_ciphers` 是否包含 `ECC-SM2-SM4-SM3` 等国密套件,并用支持国密的客户端(如 360 浏览器)测试。
日志过多影响性能 `debug` 级别日志量极大。 仅短暂开启以定位问题,事后立即关闭。
调试双向 SSL (mTLS) 证书链校验失败等。 在 `error_log` 中搜索 `client certificate` 和 `verify error` 关键字。
追踪特定客户端 生产中需要针对性调试。 使用 `debug_connection` 指令限制调试日志仅对特定 IP 生效,避免全局开启:`events { debug_connection 192.168.1.100; }`。
解密抓包验证 需要更底层的数据分析。 在 Nginx Plus 中可使用 `ssl_key_log` 指令导出 TLS 会话密钥,供 Wireshark 解密流量。
虽然原生 Nginx 对国密支持较弱,但上述方法是基于通用 TLS 调试原理提炼的。如果用于生产环境,建议优先考虑商业版 Nginx Plus 或 Tengine、OpenResty 等成熟国密方案。在配置过程中,如果遇到任何具体问题,欢迎告诉我你的详细情况,我会尽力协助你们。