Nginx 配置 SSL 證書:5分鐘搞定,再也不怕綠鎖變紅叉
分類:互聯網熱點
編輯:做網站
瀏覽量:210
2026-05-22 18:10:25
【導讀】Nginx 配置 SSL 證書的本質,是讓加密通道與服務進程達成一次安靜握手——不驚擾現有連接,不打斷用戶訪問,更不能讓瀏覽器突然彈出「您的連接不是私密連接」。
動手前必須確認的三件事
別急著改配置,先看這三項是否成立:
- OpenSSL 版本 ≥ 1.1.1f(低于此版本無法支持TLSv1.3及ALPN擴展);
- Nginx 編譯時已啟用 --with-http_ssl_module(執行 nginx -V 查看輸出中是否有該項);
- 待部署的私鑰文件權限為 400(chmod 400 domain.key),且屬主為 nginx worker 進程運行用戶(通常是 www-data 或 nginx)。
任一條件不滿足,sudo nginx -t 可能通過,但 systemctl reload nginx 會悄無聲息失敗,worker 進程仍用舊配置跑著。
正確組裝你的證書鏈(90%的問題出在這)
你收到的證書包通常含 three files:
- domain.crt :站點主體證書;
- ca-bundle.pem 或 chain.pem :中間證書鏈;
- domain.key :私鑰(如自行生成則已有)。
?? 錯誤示范:
? 直接把 root CA 也放進 chain.pem → 導致 iOS Safari 報 CERT_HAS_EXPIRED;
? 漏掉二級中間證書 → Chrome DevTools Security 標簽頁顯示“Incomplete Certificate Chain”;
? CRT 和 KEY 文件編碼格式混用(ANSI vs UTF-8 BOM)→ Nginx 啟動報 unknown directive “ssl_certificate”。
? 正確做法:
cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem
并用 openssl x509 -in fullchain.pem -text -noout | grep 'Issuer:' 確認輸出恰好兩行(不含根)。
Nginx 配置 SSL 證書的標準五步法
這是經千次生產驗證過的最小可行路徑:
備份原 conf 塊與證書文件(推薦帶日期戳:cp ssl.conf ssl.conf.bak.$(date +%Y%m%d));
將新的 domain.key 放入 /etc/nginx/ssl/private/,設置權限 chmod 400;
合成完整證書鏈:cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem;
修改 server {} 區塊內的 ssl_certificate 和 ssl_certificate_key 指向新路徑;
執行 sudo nginx -t && sudo systemctl reload nginx(不用 restart!)。
其中第5步最關鍵:“reload”只會平滑重啟 worker 進程,不影響現有 TCP 連接;而“restart”會導致毫秒級請求丟棄,電商類網站高峰期慎用。
常見故障速查表
如果瀏覽器提示 NET::ERR_CERT_AUTHORITY_INVALID 或 curl 返回 Peer's Certificate issuer is not recognized,請按順序排查:
- fullchain.pem 是否漏掉中間證書?→ 使用 https://decoder.link/certchecker 在線解析查看 Issuer Chain 層級;
- 私鑰與公鑰是否匹配?→ 執行 openssl x509 -noout -modulus -in domain.crt | md5 和 openssl rsa -noout -modulus -in domain.key | md5 對比結果;
- SSL 協議啟用范圍是否過窄?→ conf 中誤刪 ssl_protocols TLSv1.2 TLSv1.3; 導致低版本 Android WebView 拒絕協商。
建議每次更新后立即跑一遍 curl -I --resolve example.com:443:127.0.0.1 https://example.com ,觀察 Header 是否有 Strict-Transport-Security 字段回顯。
進階技巧:讓 Nginx 配置 SSL 證書更穩更省心
規模化運維場景下,還可借助這些實踐提效:
- 使用 acme.sh 配合 cron 定時自動輪轉 Let’s Encrypt 證書,并綁定 post-hook 腳本觸發 nginx reload;
- 在 Ansible Playbook 中定義 template 變量 {{ cert_path }}/{{ key_path }},實現跨集群統一批量下發;
- 啟用 ngx_http_stub_status_module 暴露 $ssl_protocol $ssl_cipher 指標,接入 Prometheus 做變更前后加密套件分布監控。
至此,你就掌握了 Nginx 配置 SSL 證書從入門到穩態交付的全鏈條技能樹。
動手前必須確認的三件事
別急著改配置,先看這三項是否成立:
- OpenSSL 版本 ≥ 1.1.1f(低于此版本無法支持TLSv1.3及ALPN擴展);
- Nginx 編譯時已啟用 --with-http_ssl_module(執行 nginx -V 查看輸出中是否有該項);
- 待部署的私鑰文件權限為 400(chmod 400 domain.key),且屬主為 nginx worker 進程運行用戶(通常是 www-data 或 nginx)。
任一條件不滿足,sudo nginx -t 可能通過,但 systemctl reload nginx 會悄無聲息失敗,worker 進程仍用舊配置跑著。
正確組裝你的證書鏈(90%的問題出在這)
你收到的證書包通常含 three files:
- domain.crt :站點主體證書;
- ca-bundle.pem 或 chain.pem :中間證書鏈;
- domain.key :私鑰(如自行生成則已有)。
?? 錯誤示范:
? 直接把 root CA 也放進 chain.pem → 導致 iOS Safari 報 CERT_HAS_EXPIRED;
? 漏掉二級中間證書 → Chrome DevTools Security 標簽頁顯示“Incomplete Certificate Chain”;
? CRT 和 KEY 文件編碼格式混用(ANSI vs UTF-8 BOM)→ Nginx 啟動報 unknown directive “ssl_certificate”。
? 正確做法:
cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem
并用 openssl x509 -in fullchain.pem -text -noout | grep 'Issuer:' 確認輸出恰好兩行(不含根)。
Nginx 配置 SSL 證書的標準五步法
這是經千次生產驗證過的最小可行路徑:
備份原 conf 塊與證書文件(推薦帶日期戳:cp ssl.conf ssl.conf.bak.$(date +%Y%m%d));
將新的 domain.key 放入 /etc/nginx/ssl/private/,設置權限 chmod 400;
合成完整證書鏈:cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem;
修改 server {} 區塊內的 ssl_certificate 和 ssl_certificate_key 指向新路徑;
執行 sudo nginx -t && sudo systemctl reload nginx(不用 restart!)。
其中第5步最關鍵:“reload”只會平滑重啟 worker 進程,不影響現有 TCP 連接;而“restart”會導致毫秒級請求丟棄,電商類網站高峰期慎用。
常見故障速查表
如果瀏覽器提示 NET::ERR_CERT_AUTHORITY_INVALID 或 curl 返回 Peer's Certificate issuer is not recognized,請按順序排查:
- fullchain.pem 是否漏掉中間證書?→ 使用 https://decoder.link/certchecker 在線解析查看 Issuer Chain 層級;
- 私鑰與公鑰是否匹配?→ 執行 openssl x509 -noout -modulus -in domain.crt | md5 和 openssl rsa -noout -modulus -in domain.key | md5 對比結果;
- SSL 協議啟用范圍是否過窄?→ conf 中誤刪 ssl_protocols TLSv1.2 TLSv1.3; 導致低版本 Android WebView 拒絕協商。
建議每次更新后立即跑一遍 curl -I --resolve example.com:443:127.0.0.1 https://example.com ,觀察 Header 是否有 Strict-Transport-Security 字段回顯。
進階技巧:讓 Nginx 配置 SSL 證書更穩更省心
規模化運維場景下,還可借助這些實踐提效:
- 使用 acme.sh 配合 cron 定時自動輪轉 Let’s Encrypt 證書,并綁定 post-hook 腳本觸發 nginx reload;
- 在 Ansible Playbook 中定義 template 變量 {{ cert_path }}/{{ key_path }},實現跨集群統一批量下發;
- 啟用 ngx_http_stub_status_module 暴露 $ssl_protocol $ssl_cipher 指標,接入 Prometheus 做變更前后加密套件分布監控。
至此,你就掌握了 Nginx 配置 SSL 證書從入門到穩態交付的全鏈條技能樹。
聲明:免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發
送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。本站原創內容未經允許不得轉載,或轉載時
需注明出處:新網idc知識百科
