瀏覽器顯示的「SSL 憑證」實際上是 TLS 身分驗證的一部分。它證明目前連線的伺服器持有對應私鑰,且憑證鏈能追溯到受信任的 CA;它不保證網站內容可靠,也不代表伺服器沒有其他漏洞。
理解握手中的三個核心檢查
- 網址的 hostname 是否出現在憑證 SAN。
- 目前時間是否落在 Not Before 與 Not After 之間。
- 伺服器提供的鏈是否能連到瀏覽器信任的根 CA。
任何一項失敗,都可能出現名稱不符、過期、尚未生效或無法建立信任鏈的警告。
用 openssl 檢查實際對外服務
不要只看主機上的憑證檔,要連到實際網域與連接埠:
openssl s_client -connect kaelith.tw:443 -servername kaelith.tw -showcerts </dev/null
openssl s_client -connect kaelith.tw:443 -servername kaelith.tw </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName-servername 會送出 SNI;缺少它時,多網域主機可能回傳預設憑證,導致誤判。
完整鏈必須由伺服器正確送出
伺服器通常要送出站台憑證與中繼憑證,不送根憑證。桌面瀏覽器可能因快取自動補鏈,但某些 API 用戶端、舊裝置與機器人會直接失敗。
Apache 常見設定是讓 SSLCertificateFile 指向包含站台與中繼憑證的 fullchain,私鑰則獨立保存:
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLProtocol -all +TLSv1.2 +TLSv1.3私鑰權限應限制為伺服器必要帳號可讀,不得放入網站根目錄或版本庫。
自動續期後要確認服務真的載入新憑證
憑證工具續期成功,不代表 Web Server 已重新載入。部署流程應包含:
- 執行 dry-run 或測試環境續期。
- 檢查新憑證檔權限與 SAN。
- 重新載入服務,而不是不必要地強制重啟。
- 從外部網路重新握手驗證。
- 在到期前 30、14、7、3 天告警。
常見錯誤要從 DNS、代理與時間一起查
- 名稱不符:DNS 指到錯主機、CDN 自訂網域未完成或憑證缺少 www。
- 過期:續期失敗、服務未 reload、代理層仍使用舊憑證。
- 鏈不完整:fullchain 設定錯誤。
- 尚未生效:伺服器系統時間錯誤或部署了未來日期憑證。
- 混合內容:HTML 是 HTTPS,但頁面仍載入 HTTP 資源;這不是憑證錯誤,需修正資源網址。
TLS 上線後再加 HSTS,順序不能反
確認所有子網域長期支援 HTTPS 後,才逐步加入 HSTS:
Strict-Transport-Security: max-age=300
# 觀察無誤後再提高,例如:
Strict-Transport-Security: max-age=31536000; includeSubDomainsincludeSubDomains 會影響所有子網域;preload 更難撤回。若仍有只支援 HTTP 的舊服務,過早啟用會造成長期中斷。
HSTS 上線前檢查
所有正式與必要子網域都能穩定使用 HTTPS、憑證自動續期已驗證,且沒有依賴 HTTP 的舊服務後,再延長 max-age。