11.14.3. 在红帽企业版 Linux 6 上启用 SSL 的 FIPS 140-2 加密
这个任务描述了如何配置 JBoss EAP 6 的 Web 容器(JBoss Web)的 SSL 为兼容 FIPS 140-2 的加密。这个任务只涵盖在红帽企业版 Linux 6 上实现的步骤。
为了这个功能,这个任务使用了 FIPS 模式的 Mozilla NSS 库。
前提条件
- 红帽企业版 Linux 6 必须已经配置为 FIPS 140-2 兼容的模式。请参考 https://access.redhat.com/knowledge/solutions/137833。
过程 11.45. 启用 SSL 的 FIPS 140-2 兼容加密
创建数据库
在jboss
用户拥有的一个目录里创建 NSS 数据库。$ mkdir -p /usr/share/jboss-as/nssdb $ chown jboss /usr/share/jboss-as/nssdb $ modutil -create -dbdir /usr/share/jboss-as/nssdb
创建 NSS 配置文件
在/usr/share/jboss-as
目录里创建一个名为nss_pkcsll_fips.cfg
的文本文件,它具有下列内容:name = nss-fips nssLibraryDirectory=/usr/lib64 nssSecmodDirectory=/usr/share/jboss-as/nssdb nssModule = fips
NSS 配置文件必须指定:- 名称
- NSS 库所在的目录,和
- 步骤 1 里创建 NSS 数据库用到的目录。
如果你使用的是红帽企业版 Linux 6 的 64 位版本,请设置nssLibraryDirectory
为/usr/lib
而不是/usr/lib64
。启用 SunPKCS11 供应商
编辑你的 JRE 的java.security
配置文件($JAVA_HOME/jre/lib/security/java.security
)并添加下列行:security.provider.1=sun.security.pkcs11.SunPKCS11 /usr/share/jboss-as/nss_pkcsll_fips.cfg
请注意这一行里指定的配置文件就是我们在步骤 2 里创建的文件。这个文件里的任何其他security.provider.X
行都必须将 X 递增以设置对应供应商的优先级。为 NSS 库启用 FIPS 模式
运行modutil
命令以启用 FIPS 模式:modutil -fips true -dbdir /usr/share/jboss-as/nssdb
请注意这里指定的目录就是我们在步骤 1 里创建的目录。此时你可能遇到一个安全库错误,要求你为某些 NSS 共享对象重新生成库签名。修改 FIPS 令牌的密码
用下列命令在 FIPS 令牌上设置密码。请注意,令牌的名称必须为NSS FIPS 140-2 Certificate DB
。modutil -changepw "
NSS FIPS 140-2 Certificate DB
" -dbdir /usr/share/jboss-as/nssdb用于 FIPS 令牌的密码必须是兼容 FIPS 的密码。使用 NSS 工具创建证书
输入下列命令来用 NSS 工具创建证书。certutil -S -k rsa -n jbossweb -t "u,u,u" -x -s "CN=localhost, OU=MYOU, O=MYORG, L=MYCITY, ST=MYSTATE, C=MY" -d /usr/share/jboss-as/nssdb
配置 HTTPS 连接器使用 PKCS11 密钥库
用 JBoss CLI 工具里的下列命令添加一个 HTTPS 连接器:/subsystem=web/connector=https/:add(socket-binding=https,scheme=https,protocol=HTTP/1.1,secure=true)
然后用下列命令添加 SSL 配置,用兼容 FIPS 的密码(参考步骤 5)替换这里的 PASSWORD。/subsystem=web/connector=https/ssl=configuration:add(name=https,password=PASSWORD,keystore-type=PKCS11, cipher-suite="SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA")
检验
运行下列命令检验 JVM 是否可以从 PKCS11 密钥库楼里读取私有密钥:keytool -list -storetype pkcs11
例 11.42. 使用 FIPS 140-2 的 HTTPS 连接器的 XML 配置
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true"> <ssl name="https" password="****" cipher-suite="SSL_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,TLS_ECDH_anon_WITH_AES_128_CBC_SHA, TLS_ECDH_anon_WITH_AES_256_CBC_SHA" keystore-type="PKCS11"/> </connector>
请注意,
cipher-suite
属性里插入了断行符以便于阅读。