資安觀念

SSL 憑證是什麼:理解網域驗證、有效期限與錯誤原因

說明 SSL/TLS 憑證的網域驗證、有效期限與信任鏈,協助判斷常見瀏覽器憑證錯誤。

SSL 憑證是什麼:理解網域驗證、有效期限與錯誤原因

瀏覽器顯示的「SSL 憑證」實際上是 TLS 身分驗證的一部分。它證明目前連線的伺服器持有對應私鑰,且憑證鏈能追溯到受信任的 CA;它不保證網站內容可靠,也不代表伺服器沒有其他漏洞。

01

理解握手中的三個核心檢查

  • 網址的 hostname 是否出現在憑證 SAN。
  • 目前時間是否落在 Not Before 與 Not After 之間。
  • 伺服器提供的鏈是否能連到瀏覽器信任的根 CA。

任何一項失敗,都可能出現名稱不符、過期、尚未生效或無法建立信任鏈的警告。

02

用 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;缺少它時,多網域主機可能回傳預設憑證,導致誤判。

03

完整鏈必須由伺服器正確送出

伺服器通常要送出站台憑證與中繼憑證,不送根憑證。桌面瀏覽器可能因快取自動補鏈,但某些 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

私鑰權限應限制為伺服器必要帳號可讀,不得放入網站根目錄或版本庫。

04

自動續期後要確認服務真的載入新憑證

憑證工具續期成功,不代表 Web Server 已重新載入。部署流程應包含:

  1. 執行 dry-run 或測試環境續期。
  2. 檢查新憑證檔權限與 SAN。
  3. 重新載入服務,而不是不必要地強制重啟。
  4. 從外部網路重新握手驗證。
  5. 在到期前 30、14、7、3 天告警。
05

常見錯誤要從 DNS、代理與時間一起查

  • 名稱不符:DNS 指到錯主機、CDN 自訂網域未完成或憑證缺少 www。
  • 過期:續期失敗、服務未 reload、代理層仍使用舊憑證。
  • 鏈不完整:fullchain 設定錯誤。
  • 尚未生效:伺服器系統時間錯誤或部署了未來日期憑證。
  • 混合內容:HTML 是 HTTPS,但頁面仍載入 HTTP 資源;這不是憑證錯誤,需修正資源網址。
06

TLS 上線後再加 HSTS,順序不能反

確認所有子網域長期支援 HTTPS 後,才逐步加入 HSTS:

Strict-Transport-Security: max-age=300
# 觀察無誤後再提高,例如:
Strict-Transport-Security: max-age=31536000; includeSubDomains

includeSubDomains 會影響所有子網域;preload 更難撤回。若仍有只支援 HTTP 的舊服務,過早啟用會造成長期中斷。

HSTS 上線前檢查

所有正式與必要子網域都能穩定使用 HTTPS、憑證自動續期已驗證,且沒有依賴 HTTP 的舊服務後,再延長 max-age。