2. FIPS模式 | 2. FIPS mode
2 FIPS模式
本章介绍加密应用程序中的FIPS模式支持。
2.1背景
可以构建OpenSSL以提供经FIPS 140-2验证的加密服务。它不是经过验证的OpenSSL应用程序,而是一个称为OpenSSL FIPS对象模块的特殊软件组件。但是,应用程序不直接使用此对象模块,而是通过OpenSSL库的常规API。
加密应用程序支持在FIPS模式下使用OpenSSL。在这种情况下,只有对象模块提供的验证算法是可访问的,其他通常在OpenSSL中可用的算法(如md5)或在Erlang代码中实现(如SRP)都是禁用的。
2.2启用FIPS模式
- 构建或安装FIPS对象模块和启用FIPS的OpenSSL库。你应该阅读并严格遵守的指示
Security Policy
和User Guide
。警告从源代码构建一个可用的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模式。
- 将
fips_mode
加密应用程序的配置设置设置为true
在加载加密模块之前
。最好的地方在于sys.config
发行版的系统配置文件中。
- 照常开始并使用加密应用程序。不过要注意避免使用非FIPS验证的算法,它们都会抛出异常
not_supported
。
不支持在已经运行加密的节点上输入和离开FIPS模式。原因是OpenSSL旨在防止请求FIPS模式的应用程序以非FIPS模式意外运行。如果进入FIPS模式失败(例如,未找到对象模块或被入侵),则任何后续使用OpenSSL API都会终止模拟器。
因此,必须在防止任何同时运行的加密操作的关键部分中执行即时FIPS模式更改。此外,如果发生故障,则必须从Erlang或nif代码中禁用所有加密调用。这将太多的精力投入到这个不太重要的功能中。
2.3与常规构建不兼容
无论构建是否支持FIPS,加密应用程序的Erlang API都是相同的。但是,nif代码在内部使用不同的OpenSSL API。
这意味着,上下文(不透明型)从流加密函数返回(hash_(init|update|final)
,hmac_(init|update|final)
和stream_(init|encrypt|decrypt)
)是不同的,并且与常规的FIPS支持编译密码时建立不相容。
2.4常见警告
在FIPS模式下,未经验证的算法被禁用。这可能会在依赖加密的应用程序中引起一些意想不到的问题。
警告
不要试图通过使用缺失算法的替代实现来解决这些问题!如果应用程序专门用于每个加密操作,则它只能声称使用经过FIPS 140-2验证的加密模块。
对密钥大小的限制
虽然公钥算法在FIPS模式下受支持,但它们只能用于安全密钥大小。安全策略要求以下最小值:
RSA
1024位DSS
1024位EC算法
160位
椭圆曲线的限制
Erlang API允许使用任意曲线参数,但在FIPS模式下,只能使用安全策略允许的参数。
避免使用md5进行散列
Md5作为散列函数是一种流行的选择,但它不够安全,无法验证。尽可能地尝试使用sha。
对于特殊的非加密用例,人们也可以考虑切换erlang:md5/1
。
证书和加密密钥
由于md5在FIPS模式下不可用,因此只能使用使用散列哈希签名的证书。在验证整个证书链时,所有证书(包括根CA)都必须遵守此规则。
对于md5和des算法的类似依赖性,PEM格式的大多数加密私钥也不起作用。但是,PBES2加密方案允许使用更强大的FIPS验证算法,这是一种可行的选择。
SNMP v3限制
它只能在FIPS模式下分别使用usmHMACSHAAuthProtocol
和usmAesCfb128Protocol
用于认证和隐私。但snmp应用程序不会以任何方式限制选择禁用的协议,并且使用它们会导致运行时崩溃。
TLS 1.2是必需的
TLS 1.2之前的所有SSL和TLS版本在握手中使用md5和sha1散列组合以实现各种目的:
- 验证握手消息的完整性。
- 在提供非匿名PFS(完美前向保密)的密码套件中交换DH参数。
- 在PRF(伪随机函数)中用于在不使用PFS的密码套件中生成密钥材料。
OpenSSL在FIPS模式下处理这些角落情况,但是Erlang加密和ssl应用程序未准备好,因此您仅限于FIPS模式下的TLS 1.2。
另一方面,值得一提的是,至少所有依赖未验证算法的密码套件都会在FIPS模式下自动禁用。
注
使用弱(md5)摘要的证书也可能导致TLS中的问题。尽管TLS 1.2具有指定接受哪种类型的签名的扩展名,并且在FIPS模式下,ssl应用程序将正确使用它,但大多数TLS实现忽略此扩展名并仅发送它们配置的任何证书。