如何检查nginx SSL配置
小樊
39
2025-11-23 02:47:51
检查 Nginx SSL 配置的实用流程
一 前置检查与语法验证
- 确认服务与配置路径
- 查看运行状态:sudo systemctl status nginx
- 主配置常见路径:/etc/nginx/nginx.conf;站点配置常见路径:/etc/nginx/sites-available/ 或 /etc/nginx/conf.d/(Debian/Ubuntu 多用 sites-available,CentOS/RHEL 多用 conf.d)
- 语法与包含文件检查
- 测试语法:sudo nginx -t
- 如自定义了配置路径:sudo nginx -t -c /path/to/nginx.conf
- 确认模块与版本
- 是否编译了 SSL 模块:nginx -V 2>&1 | grep -o with-http_ssl_module(无输出则未启用 SSL 模块)
- 查看版本:/usr/local/nginx/sbin/nginx -v 或 nginx -v
- 文件与权限
- 证书与私钥路径在 server 块中应正确,例如:
- ssl_certificate /etc/nginx/ssl/example.com.crt;
- ssl_certificate_key /etc/nginx/ssl/example.com.key;
- 权限建议:私钥 600,证书 644,属主 root:root
- 证书链完整性:优先使用 fullchain.pem;若需手工合并:cat your_domain.crt intermediate.crt > combined.crt,并将 ssl_certificate 指向合并后的文件
二 证书与握手验证
- 本机查看证书信息
- 查看本地证书内容:openssl x509 -in /path/to/cert.crt -text -noout
- 远程查看服务端证书链与握手
- 查看服务端证书链:openssl s_client -connect example.com:443 -servername example.com -showcerts
- 仅输出证书信息:openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text
- 指定协议测试(如 -tls1_2、-tls1_3):openssl s_client -connect example.com:443 -tls1_3
- 证书与私钥匹配性
- 比较 modulus(应一致):
- openssl x509 -noout -modulus -in server.crt | openssl md5
- openssl rsa -noout -modulus -in server.key | openssl md5
- 客户端连通与抓包
- 详细握手过程:curl -v https://example.com
- 协议探测:sslscan example.com
- 抓包分析(定位握手/链问题):tcpdump -i any -nn port 443 -w ssl.pcap 或用 Wireshark 分析
三 安全与兼容性核查
- 协议与套件基线
- 推荐仅启用安全协议:ssl_protocols TLSv1.2 TLSv1.3;
- 套件示例:ssl_ciphers HIGH:!aNULL:!MD5;
- 优先服务器套件:ssl_prefer_server_ciphers on;
- 证书链与顺序
- 使用 fullchain.pem(服务器证书在前,中间证书在后);缺失中间证书会导致浏览器或客户端报“证书无效/链不完整”
- 在线体检
- 使用 SSL Labs 测试评分与兼容性(关注协议、套件、链、OCSP 等)
- 进阶优化(可选)
- 启用 HSTS:add_header Strict-Transport-Security “max-age=31536000; includeSubDomains” always;
- 启用 OCSP Stapling 提升握手与验证效率
四 常见故障定位清单
- 配置语法与服务状态
- 先跑 sudo nginx -t,再 sudo systemctl reload nginx;查看错误日志:tail -f /var/log/nginx/error.log
- 证书与密钥
- 路径是否正确、文件是否存在;权限是否严格(私钥 600)
- 证书与私钥是否匹配(modulus 一致)
- 证书链问题
- 链不完整或顺序错误导致“无法构建信任链/CA 验证失败”;使用 -showcerts 检查链,或改用 fullchain.pem
- 端口与防火墙
- 确保 443/tcp 放行(如 ufw allow 443/tcp 或 firewalld/云安全组策略)
- 安全策略与兼容性
- 过时的协议/套件被禁用导致握手失败;按需调整 ssl_protocols/ssl_ciphers 并兼顾客户端兼容性
- 访问控制与安全模块
- 检查 SELinux/AppArmor 是否限制 Nginx 读取证书或绑定端口(如 sestatus)
五 一键核查命令清单
- 服务与语法
- sudo systemctl status nginx
- sudo nginx -t
- 证书与链
- openssl x509 -in /etc/nginx/ssl/example.com.crt -text -noout
- cat your_domain.crt intermediate.crt > combined.crt
- 远程与握手
- openssl s_client -connect example.com:443 -servername example.com -showcerts
- curl -v https://example.com
- 端口与日志
- ufw status 或相应防火墙规则检查
- tail -n 50 /var/log/nginx/error.log