檢視原始碼 FIPS 模式
背景
可以建構 OpenSSL 以提供 FIPS 140-2 驗證的密碼服務。驗證的不是 OpenSSL 應用程式,而是一個稱為 OpenSSL FIPS 物件模組的特殊軟體元件。然而,應用程式不是直接使用這個物件模組,而是透過 OpenSSL 函式庫的常規 API 使用。
crypto 應用程式支援在 FIPS 模式下使用 OpenSSL。在這種情況下,只有物件模組提供的驗證演算法可以存取,通常在 OpenSSL 中可用的其他演算法(例如 md5)或在 Erlang 程式碼中實作的演算法(例如 SRP)將會被停用。
啟用 FIPS 模式
- 建構或安裝 FIPS 物件模組和啟用 FIPS 的 OpenSSL 函式庫。
您應該閱讀並精確地遵循 安全策略 和 使用者指南 中的說明。
警告
從原始碼建構可用的 OpenSSL FIPS 物件模組和函式庫非常容易。但是,如果沒有正確遵循安全策略中的許多限制,它不符合 FIPS 140-2 驗證的資格。
- 配置並建構帶有 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 模式。
- 在載入 crypto 模組之前,將 crypto 應用程式的
fips_mode
配置設定為true
。
最好的位置是在版本的 sys.config
系統組態檔案中。
- 像往常一樣啟動並使用 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 模式下,只能分別使用 usmHMACSHAAuthProtocol
和 usmAesCfb128Protocol
進行驗證和隱私保護。但是,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 實作都會忽略此擴充功能,而只是傳送配置給它們的任何憑證。