首先确认Nginx配置文件(通常位于/etc/nginx/sites-available/your_domain.conf或/etc/nginx/conf.d/ssl.conf)中的SSL设置是否正确。重点检查以下指令:
ssl_certificate:指向域名证书文件(如/etc/nginx/ssl/your_domain.crt);ssl_certificate_key:指向私钥文件(如/etc/nginx/ssl/your_domain.key);listen:必须包含443 ssl(如listen 443 ssl;);ssl_protocols:建议启用TLSv1.2及以上版本(如ssl_protocols TLSv1.2 TLSv1.3;);ssl_ciphers:使用安全的加密套件(如ssl_ciphers HIGH:!aNULL:!MD5;)。配置修改后,用以下命令测试语法是否正确:
sudo nginx -t
若语法无误,重新加载Nginx:
sudo systemctl reload nginx
注意:私钥文件权限必须设为600(仅所有者可读写),避免权限过高导致Nginx无法读取:
chmod 600 /etc/nginx/ssl/your_domain.key
证书问题(过期、域名不匹配、链不完整)是SSL连接失败的常见原因。
openssl x509 -in /etc/nginx/ssl/your_domain.crt -noout -dates
若证书过期,需重新申请(如通过Let’s Encrypt的Certbot)或续期。Common Name (CN)或Subject Alternative Name (SAN)包含你的域名(如example.com、www.example.com)。chain.pem),需将中间证书与域名证书合并为完整链(如cat your_domain.crt chain.pem > combined.crt),并更新Nginx配置中的ssl_certificate指向合并后的文件。防火墙可能阻止HTTPS流量(默认443端口),需确保防火墙允许该端口:
sudo ufw allow 443/tcp
sudo ufw reload
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo service iptables restart
验证端口是否开放:
sudo netstat -tulnp | grep 443
# 或使用telnet测试(需安装telnet)
telnet your_domain.com 443
若端口未开放,需检查防火墙规则是否正确配置。
Nginx错误日志(通常位于/var/log/nginx/error.log)会记录SSL连接失败的详细原因(如证书错误、握手失败、配置语法错误)。使用以下命令实时查看SSL相关错误:
sudo tail -f /var/log/nginx/error.log | grep -i "ssl"
常见日志错误及解决方法:
SSL_CTX_use_PrivateKey_file失败:私钥文件路径错误或权限不足;certificate verify failed:证书过期或域名不匹配;no protocols available:ssl_protocols配置错误(如未启用TLSv1.2)。使用OpenSSL命令模拟客户端与服务器的SSL握手,检查协议和加密套件是否兼容:
openssl s_client -connect your_domain.com:443 -tls1_2 # 测试TLSv1.2
openssl s_client -connect your_domain.com:443 -tls1_3 # 测试TLSv1.3
输出中需包含Verify return code: 0 (ok),表示握手成功。若失败,需调整Nginx的ssl_protocols和ssl_ciphers配置。
使用在线工具(如SSL Labs)全面检查SSL配置,识别潜在问题(如弱加密套件、过时的协议版本)。
sudo timedatectl set-ntp true # 启用NTP时间同步
sudo timedatectl set-timezone Asia/Shanghai # 设置正确时区
Enforcing模式,可能阻止Nginx访问证书文件。临时设置为Permissive模式测试:sudo setenforce 0
若问题解决,需调整SELinux策略(如允许Nginx访问/etc/nginx/ssl目录):sudo semanage fcontext -a -t httpd_sys_content_t "/etc/nginx/ssl(/.*)?"
sudo restorecon -Rv /etc/nginx/ssl