首先確認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無法讀?。?/p>
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