1. 443端口未启用SSL模块
现象:配置中仅使用listen 443;而遗漏ssl参数,导致Nginx虽监听443端口但未启用SSL加密,访问时出现“ERR_SSL_PROTOCOL_ERROR”或curl报错“wrong version number”。
解决方法:修改Nginx配置,确保443端口监听指令包含ssl参数,例如:listen 443 ssl;(IPv4);如需支持IPv6,添加listen [::]:443 ssl;。
2. SSL模块未安装
现象:重载Nginx时报错“the ‘ssl’ parameter requires ngx_http_ssl_module”,表明当前Nginx未编译SSL模块,无法处理HTTPS请求。
解决方法:重新编译Nginx并添加SSL模块。步骤:下载Nginx源码→配置时加入--with-http_ssl_module→编译安装(如./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install);或通过包管理器安装带SSL模块的Nginx版本(如sudo apt install nginx-extras)。
3. 证书文件路径或权限错误
现象:重载Nginx时报错“cannot load certificate”(如/etc/nginx/ssl/domain.pem not found)或“permission denied”,导致HTTPS无法启动。
解决方法:
ssl_certificate(证书文件)和ssl_certificate_key(私钥文件)路径正确,与实际文件位置一致;chmod 600 /etc/nginx/ssl/*.pem; chmod 755 /etc/nginx/ssl;nginx或www-data)对证书文件及目录有访问权限(如chown -R nginx:nginx /etc/nginx/ssl)。4. 证书链不完整
现象:浏览器访问时提示“证书不受信任”或“证书链不完整”,主要因未包含中间证书(如CA颁发的中间证书)。
解决方法:将中间证书与服务器证书合并为完整证书链,例如:cat server.crt intermediate.crt > fullchain.pem,然后在Nginx配置中指定ssl_certificate /path/to/fullchain.pem。
5. 协议或加密套件配置不当
现象:部分浏览器(如旧版IE)提示“证书不符合标准”或“连接不安全”,因使用了不安全的TLS版本(如TLSv1.0/1.1)或弱加密套件(如MD5、DES)。
解决方法:优化Nginx配置,仅启用安全的TLS版本和加密套件:
ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLSv1.0/1.1
ssl_ciphers HIGH:!aNULL:!MD5:!RC4:!DES; # 排除弱加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件
配置后执行nginx -t测试语法,再重载Nginx。
6. 端口被占用
现象:重载Nginx时报错“bind() to 0.0.0.0:443 failed (98: Address already in use)”,表示443端口已被其他进程占用(如Apache、另一个Nginx实例)。
解决方法:
sudo ss -tlnp | grep :443;sudo systemctl stop apache2(若为Apache);sudo pkill -9 nginx后重启Nginx。7. Let’s Encrypt证书自动续期问题
现象:证书到期后未自动续期,导致HTTPS连接失败(如浏览器提示“证书已过期”)。
解决方法:
sudo apt install certbot python3-certbot-nginx;--nginx参数,Certbot会自动配置续期:sudo certbot --nginx -d yourdomain.com;sudo crontab -e,添加0 2 * * * certbot renew --quiet;sudo certbot renew --dry-run(模拟续期流程,无实际修改)。8. 强制HTTP跳转HTTPS配置错误
现象:HTTP请求未被重定向到HTTPS,导致用户仍通过不安全协议访问,或重定向循环(如反复在HTTP/HTTPS间跳转)。
解决方法:添加独立的HTTP server块,配置301永久重定向到HTTPS,例如:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 强制跳转HTTPS
}
确保HTTPS server块的server_name与HTTP块一致,避免重定向循环。