在线文档教程

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 PolicyUser 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_setno则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模式下分别使用usmHMACSHAAuthProtocolusmAesCfb128Protocol用于认证和隐私。但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实现忽略此扩展名并仅发送它们配置的任何证书。