檢視原始碼 FIPS 模式

本章描述 crypto 應用程式中的 FIPS 模式支援。

背景

可以建構 OpenSSL 以提供 FIPS 140-2 驗證的密碼服務。驗證的不是 OpenSSL 應用程式,而是一個稱為 OpenSSL FIPS 物件模組的特殊軟體元件。然而,應用程式不是直接使用這個物件模組,而是透過 OpenSSL 函式庫的常規 API 使用。

crypto 應用程式支援在 FIPS 模式下使用 OpenSSL。在這種情況下,只有物件模組提供的驗證演算法可以存取,通常在 OpenSSL 中可用的其他演算法(例如 md5)或在 Erlang 程式碼中實作的演算法(例如 SRP)將會被停用。

啟用 FIPS 模式

  1. 建構或安裝 FIPS 物件模組和啟用 FIPS 的 OpenSSL 函式庫。

您應該閱讀並精確地遵循 安全策略使用者指南 中的說明。

警告

從原始碼建構可用的 OpenSSL FIPS 物件模組和函式庫非常容易。但是,如果沒有正確遵循安全策略中的許多限制,它符合 FIPS 140-2 驗證的資格。

  1. 配置並建構帶有 FIPS 支援的 Erlang/OTP
$ cd $ERL_TOP
$ ./otp_build configure --enable-fips
...
checking for FIPS_mode_set... yes
...
$ make

如果 FIPS_mode_set 返回 no,則表示 OpenSSL 函式庫未啟用 FIPS,crypto 也不會支援 FIPS 模式。

  1. 載入 crypto 模組之前,將 crypto 應用程式的 fips_mode 配置設定為 true

最好的位置是在版本的 sys.config 系統組態檔案中。

  1. 像往常一樣啟動並使用 crypto 應用程式。但是,請注意避免使用未經 FIPS 驗證的演算法,它們都會拋出 not_supported 異常。

不支援在已經執行 crypto 的節點上進入和離開 FIPS 模式。原因是 OpenSSL 的設計目的是防止請求 FIPS 模式的應用程式最終意外地在非 FIPS 模式下執行。如果進入 FIPS 模式失敗(例如,找不到物件模組或物件模組已損壞),則後續對 OpenSSL API 的任何使用都會終止模擬器。

因此,必須在一個受任何同時執行的 crypto 操作保護的關鍵部分中執行即時 FIPS 模式變更。此外,如果發生失敗,則必須從 Erlang 或 nif 程式碼中停用所有 crypto 呼叫。這將為這個不太重要的功能付出太多的努力。

與常規建構不相容之處

無論是否建構 FIPS 支援,crypto 應用程式的 Erlang API 都是相同的。但是,nif 程式碼在內部使用不同的 OpenSSL API。

這表示從串流 crypto 函式(hash_(init|update|final)hmac_(init|update|final)stream_(init|encrypt|decrypt))返回的上下文(一種不透明類型)在用 FIPS 支援編譯 crypto 時與常規建構不同且不相容。

常見注意事項

在 FIPS 模式下,未經驗證的演算法將會被停用。這可能會導致依賴 crypto 的應用程式中出現一些意外的問題。

警告

不要嘗試透過使用遺失演算法的替代實作來解決這些問題!只有在應用程式為每個密碼操作都專門使用 FIPS 140-2 驗證的密碼模組時,應用程式才能宣稱正在使用該模組。

金鑰大小限制

雖然在 FIPS 模式下支援公鑰演算法,但它們只能與安全的金鑰大小一起使用。安全策略要求以下最小值

  • RSA - 1024 位元

  • DSS - 1024 位元

  • EC 演算法 - 160 位元

橢圓曲線限制

Erlang API 允許使用任意曲線參數,但在 FIPS 模式下,只能使用安全策略允許的參數。

避免使用 md5 進行雜湊

Md5 是一種流行的雜湊函式選擇,但它不夠安全,無法驗證。請盡可能嘗試改用 sha。

對於特殊的非密碼應用案例,可以考慮切換到 erlang:md5/1

憑證和加密金鑰

由於在 FIPS 模式下無法使用 md5,因此只能使用使用 sha 雜湊簽署的憑證。在驗證整個憑證鏈時,所有憑證(包括根 CA 的憑證)都必須符合此規則。

由於對 md5 和 des 演算法的類似依賴,PEM 格式中的大多數加密私鑰也無法使用。但是,PBES2 加密方案允許使用更強大的 FIPS 驗證演算法,這是一種可行的替代方案。

SNMP v3 限制

在 FIPS 模式下,只能分別使用 usmHMACSHAAuthProtocolusmAesCfb128Protocol 進行驗證和隱私保護。但是,snmp 應用程式不會以任何方式限制選擇停用的協定,使用它們會導致執行階段崩潰。

需要 TLS 1.2

TLS 1.2 之前的所有 SSL 和 TLS 版本都在握手過程中結合使用 md5 和 sha1 雜湊用於各種目的

  • 驗證握手訊息的完整性。
  • 在提供非匿名 PFS(完美前向保密)的密碼套件中交換 DH 參數。
  • 在不使用 PFS 的密碼套件中,PRF(虛擬隨機函式)會產生金鑰材料。

OpenSSL 在 FIPS 模式下會處理這些邊緣情況,但是 Erlang crypto 和 ssl 應用程式並未針對它們做好準備,因此在 FIPS 模式下,您僅限於使用 TLS 1.2。

另一方面,值得一提的是,至少所有依賴未經驗證演算法的密碼套件都會在 FIPS 模式下自動停用。

注意

使用弱(md5)摘要的憑證也可能在 TLS 中造成問題。儘管 TLS 1.2 有一個擴充功能,用於指定接受哪種簽名類型,並且在 FIPS 模式下,ssl 應用程式會正確使用它,但大多數 TLS 實作都會忽略此擴充功能,而只是傳送配置給它們的任何憑證。