密碼編譯信任存放區

最後更新: 2023-08-26 03:30:48 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

信任存放區包含本機信任錨點,在某些平台上也包含中繼憑證或私密金鑰項目。驗證者會在建立並驗證 X.509 憑證路徑時使用這些錨點。因此,安裝根憑證會改變每個讀取該存放區之用戶端的安全邊界。

信任存放區邊界 #

主機上不存在通用信任存放區。連線可能跨越數個獨立的政策邊界:

邊界常見行為作業問題
作業系統提供全機器與每位使用者的錨點哪個帳戶與應用程式會繼承這項變更?
瀏覽器可能使用作業系統存放區,或維護自己的根程式與資料庫受管理政策是否覆寫瀏覽器預設值?
語言執行環境可能使用作業系統 API、封裝的 CA bundle 或執行環境金鑰庫哪個執行環境版本與程序設定會選取存放區?
應用程式可以攜帶私有 bundle,或釘選選定的簽發者或金鑰簽發者變更時誰會更新 bundle?

Windows 暴露個別的目前使用者與本機電腦存放區。受信任的根憑證授權單位包含錨點,中繼憑證授權單位支援鏈建置,而個人可以包含帶有私密金鑰的終端實體憑證。本機電腦根憑證影響的主體比目前使用者根憑證更多,因此需要相應的管理控制。

Apple 平台使用具有使用者、管理員與系統網域的 Keychain 信任設定。Linux 發行版通常會從管理員管理的來源目錄產生系統 CA bundle 與雜湊憑證目錄。路徑與更新命令各不相同,因此請使用發行版的憑證管理機制,而不是將 PEM 檔案複製到猜測的 OpenSSL 目錄。

瀏覽器與執行環境行為必須測試,而不能推測。Firefox 可以維護 NSS 憑證資料庫,而企業政策可以匯入或查詢平台根憑證。Java 應用程式可以明確選取 JSSE truststore,否則使用 cacerts 等執行環境預設值。Python、Node.js、容器與靜態封裝的應用程式各自可能選取不同 bundle。在部署文件中記錄實際的使用者與設定。

根、中繼與私有 CA 安裝 #

只有在適當信任設定的錨點存放區中安裝後,根 CA 憑證才會成為信任錨點。信任它會將當地政策與憑證限制允許的每個名稱與用途之權限委派出去。只匯入公開根憑證;根私密金鑰應存放在受控的 CA 基礎架構中,而不是用戶端機器上。

中繼 CA 通常屬於鏈建置資料,而不是根存放區。伺服器應傳送將其葉憑證連接到已知錨點所需的中繼憑證。將中繼憑證標記為錨點可能改變名稱限制、政策與路徑處理行為,因為 RFC 5280 的路徑驗證從本機信任資訊開始。

私有 CA 部署不只需要匯入憑證:

  1. 定義允許的 DNS 命名空間、延伸金鑰用途、憑證生命週期與簽發核准政策。
  2. 使用存取控制與受保護的金鑰儲存保護線上簽發金鑰;在部署模型允許時保留離線根憑證。
  3. 只將所需的公開錨點分發到明確的使用者、機器、容器、執行環境或應用程式範圍。
  4. 清查接收錨點的每個存放區,因為移除時必須涵蓋全部存放區。

開發用攔截 CA 也需要相同控制。任何持有 CA 私密金鑰的人,都能在用戶端信任政策內為任意網站簽發憑證。限制範圍與生命週期,絕不共用產生的私密金鑰,並在測試後移除錨點。

擁有權、更新與回復 #

將信任變更視為版本化設定。每個錨點都需要擁有者、指紋、用途、核准範圍、安裝來源、啟用日期、到期或審查日期與移除程序。分發應使用受管理政策或平台支援的更新工具,讓後續變更具有確定性。

CA 輪替需要重疊期間。在簽發依賴新根憑證的鏈之前先分發新根,監控路徑建置結果,並在已部署憑證與用戶端不再需要舊根後才移除它。保留經測試的回復套件,以移除新錨點並還原先前 bundle 或信任設定,而不停用憑證驗證。

撤銷無法可靠地撤回意外信任的私有根憑證,因為信任錨點撤銷處理依平台而異。入侵回應必須包括停止簽發、替換受影響憑證、從每個受管理存放區移除錨點、輪替 CA 金鑰,以及調查暴露期間簽發的憑證。

驗證路徑建置 #

驗證必須重現目標用戶端的輸入:葉憑證、不受信任的中繼憑證、信任錨點、DNS 名稱、驗證時間、預期用途與演算法政策。OpenSSL 可以診斷一條明確路徑:

sh
openssl verify \
  -CAfile organization-roots.pem \
  -untrusted intermediates.pem \
  -purpose sslserver \
  -verify_hostname api.example.com \
  server.pem

結果只證明該 OpenSSL 呼叫的政策。也要測試實際瀏覽器、執行環境或應用程式,因為另一個路徑建置器可能選取不同的簽發者、信任錨點或政策。使用診斷用戶端檢查所提供的鏈,確認選取錨點的指紋,並測試有效端點與預期失敗,例如錯誤主機名稱或未知根憑證。

不要使用 --insecure、停用主機名稱檢查、將葉憑證安裝為廣泛錨點,或替換應用程式信任管理器來讓測試通過。這些操作會繞過正在調查的屬性,並可能將鏈設定錯誤轉變為正式環境漏洞。

憑證結構與路徑驗證詳細資料請參閱 X.509 憑證。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)