配置国密证书时,如果遇到问题,可以先明确一点:标准Nginx默认不支持国密算法。因此,排查的第一步是确认你使用的是支持国密的Nginx版本(如基于Tongsuo或GmSSL编译的版本)。
以下是一个系统化的排查流程,你可以按顺序操作:
第一步:基础语法与配置检查
1. 检查配置文件语法:这是最基础的一步,可以快速发现明显的配置错误。
bash
sudo nginx -t
如果输出 `syntax is ok` 和 `test is successful`,说明语法正确。如果报错,请根据提示定位问题,如路径错误、指令拼写错误等。
2. 检查证书与私钥文件:确保证书和私钥文件存在、路径正确,且Nginx进程有读取权限。
权限设置:建议将证书和私钥文件权限设置为 `600`。
证书与私钥匹配性:使用以下命令验证证书和私钥是否匹配(比较输出的MD5值是否一致)。
bash
openssl x509 -noout -modulus -in /path/to/your_cert.pem | openssl md5
openssl rsa -noout -modulus -in /path/to/your_private.key | openssl md5
对于SM2私钥,可能需用 ec 命令
openssl ec -noout -modulus -in /path/to/your_sm2.key | openssl md5
证书有效期:确保证书没有过期。
bash
openssl x509 -in /path/to/your_cert.pem -noout -dates
第二步:日志分析与连接测试
如果基础检查无误,但服务仍不正常,就需要深入分析。
1. 查看Nginx错误日志:错误日志是定位问题的核心线索。
bash
sudo tail -f /var/log/nginx/error.log | grep -i 'ssl'
关注日志中的 `cannot load certificate`, `SSL_CTX_use_PrivateKey_file failed`, `no shared cipher` 等关键字。
2. 测试SSL连接:使用 `openssl s_client` 模拟SSL握手,观察结果。
bash
openssl s_client -connect your_domain.com:443 -servername your_domain.com -tls1_2
关注输出:检查 `Protocol`(协议版本)、`Cipher`(加密套件)是否正确,以及 `Verify return code` 是否为 `0`(表示验证通过)。
第三步:国密特定问题排查
如果上述步骤没有发现问题,问题很可能出在国密特有的配置上。
Nginx是否支持国密? 再次确认你的Nginx是通过支持国密的OpenSSL分支(如Tongsuo、GmSSL)编译的,或加载了国密模块。运行 `nginx -V` 查看编译参数中是否包含 `--with-ssl` 且链接到了国密库。
密码套件(Cipher Suite)配置是否正确? 确保 `ssl_ciphers` 指令配置了正确的国密套件,例如 `ECDHE-SM2-SM4-CBC-SM3`。
协议版本是否兼容?国密双证书体系通常需要启用 `TLSv1.1` 和 `TLSv1.2`。可以检查 `ssl_protocols` 指令的设置。
双证书配置是否正确? 国密常采用“双证书”体系(签名证书+加密证书)。需确保配置正确加载了**签名证书、签名私钥、加密证书和加密私钥。
椭圆曲线(EC Curve)名称是否正确? 对于新版Nginx,`ssl_ecdh_curve` 应设置为 `SM2`,而不是 `secp256k1`。
国密配置检查清单
你可以对照以下清单快速自查:
国密版Nginx:确认已安装并运行支持国密的Nginx(如Tongsuo/GmSSL版)。
双证书文件:是否已准备好签名证书、签名私钥、加密证书、加密私钥及CA证书链?
PEM格式:确认所有证书和私钥都转换为Nginx支持的PEM格式。
密码套件:`ssl_ciphers` 是否指定了正确的国密套件?
协议版本:`ssl_protocols` 是否包含了 `TLSv1.1` 和 `TLSv1.2`?
椭圆曲线:`ssl_ecdh_curve` 是否设置为 `SM2`?
文件路径与权限:所有证书和私钥路径是否正确,权限是否为600?
补充建议
使用专业工具:可以利用 [SSL Labs](https://www.ssllabs.com/ssltest/) 等在线工具进行深度检测。
验证国密功能:可使用 `gmssl` 命令行工具(国密版OpenSSL)来验证服务端的国密支持情况。
如果能提供具体的错误日志或配置片段,我可以帮你做更精准的分析。