curl 8.22 收緊無憑證情境下的公開金鑰固定驗證

curl 8.22.0 於 2026 年 9 月 2 日發布,其中包含一項 OpenSSL TLS 修正,專案描述為「只有在未設定公開金鑰固定時,缺少伺服器憑證才可能被接受」。核心含義很清楚:一旦設定公開金鑰固定,對端沒有提供憑證,就不能進入專為明確關閉憑證驗證環境保留的接受路徑。

明亮全球網際網路路線只有在憑證與公開金鑰固定證據相符時才通過玻璃代理閘道

變更也統一選取適用的固定設定,包括區分 HTTPS 代理與目標伺服器。HTTPS 請求經由 HTTPS 代理時可能存在兩個獨立 TLS 對端,因此兩層信任決策必須分開。

修正了什麼

公開金鑰固定會比較對端憑證中的公開金鑰與預設值或摘要。它是額外身分約束,並不代表可以忽略一般憑證與主機名稱驗證。

修正前,OpenSSL 路徑遇到「無對端憑證」時,只要憑證驗證關閉,就可能接受該情況,卻沒有同時確認是否設定固定。curl 8.22 收緊條件:只有驗證關閉且沒有適用固定時,才可能接受無憑證情況。

此修正不會自動輪換固定、不會修正錯誤固定、不會合併代理與來源站固定,也不會讓 TLS 失敗變成可任意重試的網路錯誤。

為何代理營運需要關注

用戶端可先與 HTTPS 代理建立 TLS,再建立 CONNECT 通道,之後與目標站建立第二層 TLS。四個概念不可混淆:

  1. HTTPS 代理憑證驗證代理端點;
  2. 目標憑證驗證通道內來源站;
  3. 代理公開金鑰固定約束代理層;
  4. 來源站公開金鑰固定約束目標層。

TCP 已連線至代理並不證明來源站身分,來源站固定也不能驗證代理。可參考代理閘道憑證到期處置手冊,把例行到期監控與固定驗證分開。

找出需要複核的設定

盤點使用 curl 或 libcurl 且採用 OpenSSL 系列 TLS 後端的應用程式。必須記錄實際執行中的程式庫版本,不能只查看同一主機的命令列 curl。

優先檢查:

  • 來源站公開金鑰固定;
  • HTTPS 代理公開金鑰固定;
  • 實驗室或歷史例外中關閉對端驗證;
  • 代理與來源站使用不同 TLS 設定;
  • 自訂連線重用或共享連線快取;
  • TLS 失敗後自動輪換代理;
  • 代理失敗後直連回退。

盤點中不要儲存完整固定材料或私密設定值,只記錄別名、固定版本、負責人、對端層級及預定退役日期。

建立雙層回歸矩陣

只使用自有或受控代理及來源站,不要在無關公共服務上模擬缺少憑證。

情境代理憑證代理固定來源站憑證來源站固定預期
基線有效相符有效相符成功
代理固定錯誤有效不符有效相符代理 TLS 失敗
來源站固定錯誤有效相符有效不符來源站 TLS 失敗
代理無憑證缺少已設定未到達已設定代理 TLS 失敗
來源站無憑證有效相符缺少已設定來源站 TLS 失敗
驗證關閉且無固定僅受控實驗室僅受控實驗室依書面政策處理

最後一列不是正式環境建議,只用於證明「關閉驗證且無固定」與「存在固定但無法驗證」會得到不同結果。

驗證實際 TLS 後端

不同 libcurl 組建可使用不同 TLS 後端。容器、語言繫結或靜態連結服務未必使用系統 curl。每項測試至少記錄:

client_build_alias
curl_version
tls_backend
route_type
peer_layer
verification_policy
pin_configured
certificate_present
curl_result
connection_reused

不得記錄代理密碼、私密金鑰、完整授權標頭或 Cookie。若診斷輸出包含憑證細節,應限制存取權限與保存期限。

分開代理與來源站設定

代理 TLS 驗證與來源站 TLS 驗證具有不同控制項,公開金鑰固定亦然。程式碼審查可建立「代理 TLS」及「來源站 TLS」兩欄設定圖,把 CA 政策、主機名稱驗證、公開金鑰固定、用戶端憑證及 SNI 歸入正確層級。

任何同時出現在兩欄的值都必須有明確理由。HTTP 邊界可使用代理請求標頭完整性測試,但不能用標頭證據取代 TLS 身分證據。

將缺少憑證視為身分失敗

設定固定後若對端不提供憑證,更換住宅出口並非解法,因為用戶端缺少政策要求的身分證據。應歸類為 TLS 身分失敗,停止該路線重試並通知負責人。

禁止:

  • 為通過請求而關閉公開金鑰固定;
  • 關閉對端或主機名稱驗證;
  • 快速輪換大量出口;
  • 靜默回退直連;
  • 使用另一 TLS 層的憑證替代;
  • 把診斷密鑰複製至工作單。

正確動作可能是恢復預期端點、修正閘道設定、執行核准的固定過渡,或在不降低安全要求下回復用戶端版本。

安全輪換公開金鑰固定

固定會讓用戶端與金鑰變更產生維運耦合。在用戶端和政策允許時,應維護目前值與下一值的書面過渡計畫,並在憑證續期或閘道替換前完成受控驗證。

追蹤固定所屬層級、版本與啟用視窗、憑證或金鑰輪換負責人、分批與回復標準、最大重疊期及舊值移除。不要為避免故障而長期保留過寬或過期的固定集合。

涵蓋連線重用

重用連線會隱藏新握手問題,直到快取過期才顯現。測試應同時涵蓋新連線及正式環境重用政策,並在受控端點或憑證切換後驗證舊連線不會被錯誤歸因至新設定。

應分別統計新建與重用連線。只執行暖連線的分批測試可能錯過新部署真正會遇到的問題。

上線門檻

  • 代理與來源站固定只在各自層級相符時成功;
  • 錯誤代理固定在通道使用前失敗;
  • 錯誤來源站固定在通道內失敗;
  • 存在相關固定時,缺少憑證必須失敗;
  • TLS 身分失敗不觸發失控輪換;
  • 強制代理任務不回退直連;
  • 新建與重用連線均符合政策;
  • 日誌指出失敗層級且不洩露機密;
  • 已記錄固定輪換與回復負責人;
  • 有效結果率與尾端延遲在分批預算內。

升級檢查清單

  • [ ] 已確認執行中的 curl/libcurl 版本及 TLS 後端。
  • [ ] 已分別盤點來源站及 HTTPS 代理固定。
  • [ ] 關閉驗證的例外已有紀錄與移除日期。
  • [ ] 受控測試涵蓋相符、不符與無憑證。
  • [ ] 代理及來源站兩層 TLS 均已測試。
  • [ ] 已涵蓋新建及重用連線。
  • [ ] 身分失敗採用有界且不輪換的處理。
  • [ ] 強制代理任務禁止直連回退。
  • [ ] 日誌不含密碼、私密金鑰、Cookie 或完整權杖。
  • [ ] 目前值與下一值的切換流程已演練。
  • [ ] 分批與回復門檻已核准。

常見問題

所有 curl 使用者都受影響嗎?

不是。此修正主要涉及 OpenSSL 後端遇到缺少對端憑證,同時設定公開金鑰固定或關閉驗證的情境。必須核實實際後端與設定。

公開金鑰固定能取代 CA 與主機名稱驗證嗎?

不應如此使用。固定是額外約束,應與組織憑證政策共同設計,不能因為有固定就關閉一般驗證。

代理固定與目標固定相同嗎?

不同。HTTPS 代理與通道內目標是不同 TLS 對端,必須獨立設定、輪換與觀測。

缺少憑證應更換出口重試嗎?

不應自動這樣做。政策要求固定時,缺少憑證代表必要身分證據不可用,應停止並診斷相應 TLS 層。

相關 98IP 指南包括代理憑證輪換代理容錯移轉演練代理繞過稽核

來源說明:curl 專案《Changes in 8.22.0》,發布於 2026 年 9 月 2 日;curl 專案變更「openssl: no server cert is only okay if also not pinned」,合併於 2026 年 8 月 25 日。外部資料位置僅保留於內部營運紀錄。

僅在自有或明確獲准的受控系統上測試。遵守憑證政策、存取條款、隱私義務與適用法律。不得為完成代理測試而削弱 TLS 驗證或洩露憑證。