SSL 證書問題是網站可能遇到的最具破壞性的技術問題之一。過期的證書會透過瀏覽器警告將每個訪問者鎖定。錯誤配置的證書會導致靜默失敗。頒發給錯誤域的證書會破壞子域。與大多數問題不同的是,證書問題是按計劃發生的——它們會過期——所以如果你知道去哪裡尋找,它們是完全可以預防的。
以下是如何檢查任何 SSL 證書、每個欄位的含義以及出現錯誤時該怎麼做。
快速檢查:您的瀏覽器
對於您訪問的任何網站,最快的 SSL 檢查就在您的瀏覽器中。
鉻/邊緣: 單擊 URL 旁邊的鎖圖示(或“連線安全”文字) → 證書有效 → 證書詳細資訊
火狐瀏覽器: 單擊鎖圖示 → 連線安全 → 更多資訊 → 檢視證書
這向您展示:
- 證書頒發給誰(域)
- 誰頒發的(證書頒發機構)
- 有效期自 / 有效期至日期
- 證書序列號和指紋
對於快速健全性檢查 - 該證書是否有效,它是否屬於正確的域 - 瀏覽器 UI 就是您所需要的。
徹底檢查:線上工具
要對證書進行完整分析,包括密碼套件、鏈有效性、HSTS 配置和已知漏洞,請使用 SSL 檢查工具。輸入任何域,它都會執行完整的分析,無需安裝任何東西。
這對於以下情況特別有用:
- 無法直接訪問的伺服器上的證書
- 安裝後驗證新證書
- 在證書即將過期之前檢查證書
- 稽核密碼套件強度(應禁用 TLS 1.0/1.1)
命令列:openssl
對於開發人員和系統管理員來說, openssl 為您提供從終端直接進行證書檢查。
檢查遠端伺服器的證書:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -text
這將返回完整的證書詳細資訊。要檢視的關鍵欄位:
有效期:
openssl s_client -connect example.com:443 -servername example.name </dev/null 2>/dev/null | openssl x509 -noout -dates
輸出:
notBefore=Jan 1 00:00:00 2025 GMT
notAfter=Jan 1 00:00:00 2026 GMT
檢視本地證書檔案:
openssl x509 -in certificate.crt -noout -text
openssl x509 -in certificate.crt -noout -dates
openssl x509 -in certificate.crt -noout -subject -issuer
驗證證書鏈:
openssl verify -CAfile chain.pem certificate.crt
檢查過期天數(可編寫指令碼):
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I{} date -d {} +%s | xargs -I{} expr \( {} - $(date +%s) \) / 86400
返回剩餘天數。在監視指令碼中很有用。
每個證書欄位的含義
主題/通用名稱(CN): 頒發證書的域名。必須與您正在訪問的域匹配,否則瀏覽器將顯示警告。對於萬用字元證書,這是 *.example.com.
主題備用名稱 (SAN): 證書涵蓋的所有域的列表。現代證書使用 SAN 而不僅僅是 CN。證書可能涵蓋 example.com, www.example.com,和 api.example.com — 全部列在這裡。這就是瀏覽器實際檢查的內容。
發行人: 簽署證書的證書頒發機構 (CA)。常見的有:Let's Encrypt、DigiCert、Sectigo、Google Trust Services、Amazon。頒發者自己的證書由瀏覽器信任的根 CA 簽名。
有效期: 不在日期之前和之後。證書過期 — Let's Encrypt 證書每 90 天過期(自動續訂)。商業證書的有效期通常為 1 年。
關鍵演算法和大小: RSA 2048 位為最低; 4096 位或 EC P-256 更強。 EC(橢圓曲線)證書以較小的金鑰大小提供同等的安全性,從而略微提高了效能。
TLS 版本: 您的伺服器應支援 TLS 1.2 和 TLS 1.3。 TLS 1.0 和 1.1 已棄用,應禁用 — 現代瀏覽器拒絕這些連線。
證書透明度: 現代證書記錄在公共證書透明度日誌中。這對於 Chrome 信任的證書是強制性的。它允許任何人稽核為某個域頒發了哪些證書——對於檢測未經授權的證書很有用。
常見 SSL 問題及其解決方法
證書過期 最常見的問題。您的瀏覽器顯示“您的連線不是私人連線”並出現錯誤 NET::ERR_CERT_DATE_INVALID.
修復:更新證書。如果您使用 Let's Encrypt with Certbot,請執行 certbot renew。如果使用付費證書,請透過您的 CA 購買續訂並安裝它。設定監控以在到期前 30 天提醒您,這樣在生產中就不會發生這種情況。
證書域名不匹配 證書頒發給 example.com 但你正在訪問
視野中發現 www.example.com (或反之亦然),並且證書不包含另一個作為 SAN。
修復:要麼獲取涵蓋兩者的證書(大多數證書都應該),要麼一致地將一個證書重定向到另一個證書。
證書鏈不完整 您的伺服器正在提供您的證書,但不提供將其連線到受信任根 CA 的中間證書。快取了中間內容的瀏覽器可以連線;其他人看到錯誤。
修復:配置您的網路伺服器以傳送完整鏈。對於 Nginx,使用 ssl_certificate 指向包含您的證書和中間包的檔案。對於阿帕奇,使用 SSLCertificateChainFile.
專門檢查這個問題:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | grep -A 1 "Certificate chain"
您應該在鏈中看到至少 2 個證書(您的證書 + 中間證書)。
自簽名證書 瀏覽器不信任未經認可的 CA 簽名的證書。自簽名證書適合內部開發,但會對任何面向公眾的網站觸發警告。
修復:從受信任的 CA 獲取證書。 Let's Encrypt 對於公共領域是免費且自動化的。
弱密碼套件 The server negotiates a TLS connection using outdated or weak algorithms (RC4, DES, export-grade ciphers, TLS 1.0/1.1).
檢查:
nmap --script ssl-enum-ciphers -p 443 example.com
修復:僅將 Web 伺服器的 SSL 配置更新為現代密碼套件。莫斯拉的 SSL 配置生成器 為 Nginx、Apache 等生成可立即貼上的配置。
證書監控
在證書過期之前手動檢查證書無法擴充套件。自動監控選項:
Certbot 自動續訂: 如果您使用 Let's Encrypt,Certbot 會設定一個 cron 作業或 systemd 計時器,在證書剩餘時間少於 30 天時自動續訂證書。驗證它是否正常工作: certbot renew --dry-run
正常執行時間監控服務: 大多數正常執行時間監視器(UptimeRobot、Freshping、Better Uptime)都包含證書到期警報。設定 30 天的警告閾值。
cron 中的自定義指令碼: 一個簡單的 bash 指令碼,使用 openssl 命令可以檢查過期時間併傳送電子郵件警報。
上面的
#!/bin/bash
DOMAIN="example.com"
DAYS_LEFT=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I{} python3 -c "from datetime import datetime; print((datetime.strptime('{}', '%b %d %H:%M:%S %Y %Z') - datetime.utcnow()).days)")
if [ "$DAYS_LEFT" -lt 30 ]; then
echo "Certificate for $DOMAIN expires in $DAYS_LEFT days" | mail -s "SSL Warning" admin@example.com
fi
底線
證書問題是可以預測和預防的。主要的問題——過期、域名不匹配、不完整的鏈——都在 SSL 檢查中清楚地顯示出來。
使用以下命令對任何域執行檢查 SSL 檢查工具。對於生產伺服器,設定至少 30 天警報視窗的到期監控。如果您仍在使用 TLS 1.0 或 1.1,請禁用它們 - 任何現代伺服器都應該僅使用 TLS 1.2+。