开启  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  等成熟国密方案。在配置过程中,如果遇到任何具体问题,欢迎告诉我你的详细情况,我会尽力协助你们。