首先确认Nginx是否已编译安装SSL模块(--with-http_ssl_module
),这是配置SSL的基础。通过以下命令查看Nginx编译参数:
sudo nginx -V 2>&1 | grep -o with-http_ssl_module
若未输出with-http_ssl_module
,需重新编译Nginx并添加该模块(需下载Nginx源码并执行./configure --with-http_ssl_module && make && sudo make install
)。
/etc/nginx/sites-available/default
或/etc/nginx/conf.d/ssl.conf
)中的ssl_certificate
(证书文件,如.crt
)和ssl_certificate_key
(私钥文件,如.key
)指令,确保路径与实际文件位置一致。www-data
)读写,执行以下命令:sudo chmod 600 /etc/nginx/ssl/your_domain.crt /etc/nginx/ssl/your_domain.key
sudo chown www-data:www-data /etc/nginx/ssl/your_domain.key # 私钥文件需归属www-data
若私钥权限过宽(如644
),会导致Nginx拒绝加载。openssl x509 -in /etc/nginx/ssl/your_domain.crt -noout -dates
若证书已过期,需联系证书提供商续签。openssl x509 -noout -modulus -in /etc/nginx/ssl/your_domain.crt | openssl md5
openssl rsa -noout -modulus -in /etc/nginx/ssl/your_domain.key | openssl md5
若两行输出的MD5值不同,说明证书与私钥不匹配,需重新生成或获取正确的私钥。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
:证书链不完整(需添加中间证书);unsupported protocol
:客户端与服务器TLS版本不匹配。在Nginx配置文件的server
块中,明确指定支持的TLS版本(推荐TLSv1.2
及以上)和安全的加密套件,避免使用过时或不安全的协议(如SSLv2、SSLv3):
ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLSv1.0/1.1
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件
修改后需测试配置语法并重载Nginx。
每次修改配置文件后,务必执行以下命令:
# 测试配置语法(无错误则继续)
sudo nginx -t
# 重载Nginx(应用新配置)
sudo systemctl reload nginx # 或 sudo nginx -s reload
若nginx -t
报错,需根据提示修正配置文件中的语法问题(如括号不匹配、指令拼写错误)。
通过SSL Labs的SSL Server Test输入域名,检查证书链完整性、协议支持、加密套件安全性等指标。工具会给出详细的整改建议(如添加缺失的中间证书、禁用不安全的协议)。
若服务器启用了防火墙(如ufw
、iptables
),需确保允许HTTPS流量(443端口)通过:
# 使用ufw(Ubuntu默认防火墙)
sudo ufw allow 443/tcp
sudo ufw reload
# 使用iptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo service iptables restart
若443端口未开放,客户端无法建立HTTPS连接。