我们正在尝试让 TLS1.2 在以下环境中以 FIPS 模式工作。当尝试写入使用 SSLContext 为协议“TLSv1.2”创建的 SSLSocket 时,它失败并出现错误java.security.NoSuchAlgorithmException: no such algorithm: SunTls12RsaPremasterSecret for provider SunPKCS11-NSS。
环境:
- Java:OpenJDK 1.8.0_25-b17(客户端和服务器)
- 操作系统:CentOS 6.5 版(最终版)
- NSS:nss-3.16.2.3-3.el6_6.x86_64
- 使用 modutil 在密钥库上启用 FIPS 模式。
我相信答案是否定的,TLS1.2 在 FIPS 模式下不适用于 NSS 3.16+。我需要果断地确定:
- 这是否预计会起作用,因此我应该继续挖掘以找出我们做错了什么(在这种情况下,需要指示和想法来完成这项工作)或
- 它不受支持,因此我应该期望它在未来的 NSS 版本中得到支持
以下是目前收集到的证据:
- 尝试使用 TLS1.2 时发生的错误是 java.security.NoSuchAlgorithmException: no such algorithm: SunTls12RsaPremasterSecret for provider SunPKCS11-NSS。在这篇文章中讨论了一个相同的错误消息,并表明这意味着不支持 TLS 1.2。
- NSS 的 FIPS 验证最后一次是在 2010 年在 NSS 版本 3.12.14 上执行的。在 3.15.1 之前的任何 NSS 发行说明中都没有提到 TLS1.2 支持。此处发布了一个相关问题,但没有具体提及 TLSv1.2。
- CentOS 6.5 发行说明中表示支持 FIPS 模式和 TLS1.2,但没有提及是否同时支持这两者。
- 当系统不在 FIPS 模式下时,我们使用 TLS1.2 SSLContext(客户端和服务器)的测试工作。在运行 modutil –fips true 后运行完全相同的测试会导致下面提供的描述的错误和控制台输出。
相关的 javax.net.debug 输出如下:
*** 客户端您好,TLSv1.2 RandomCookie: GMT: 1409235389 字节 = { 122, 104, 164, 187, 130, 152, 6, 95, 250, 230, 146, 99, 164, 228, 116, 203, 188, 51, 48, 140, 196, 35、87、33、228、67、15、120} 会话 ID:{} Cipher Suites: [TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 压缩方法:{0} 扩展签名算法、签名算法:SHA512withECDSA、SHA512withRSA、SHA384withECDSA、SHA384withRSA、SHA256withECDSA、SHA256withRSA、SHA224withECDSA、SHA224withRSA、SHA1withECDSA、SHA1withRSA、SHA1withDSA、MD5withRSA *** 修剪过的 %% 协商:[会话 1,TLS_RSA_WITH_AES_128_CBC_SHA256] *** 服务器你好,TLSv1.2 RandomCookie: GMT: 1409235389 字节 = { 217, 13, 11, 142, 204, 139, 77, 178, 239, 246, 177, 116, 225, 208, 217, 77, 128, 106, 206, 72, 40, 229、46、232、54、172、74、41} 会话 ID:{84、255、58、189、125、207、159、166、144、6、19、157、173、113、80、88、204、69、101、231、227、242、144、 59、174、147、158、65、14、78、182、52} 密码套件:TLS_RSA_WITH_AES_128_CBC_SHA256 压缩方式:0 扩展 renegotiation_info、renegotiated_connection: *** 密码套件:TLS_RSA_WITH_AES_128_CBC_SHA256 修剪过的 *** 服务器HelloDone [阅读] MD5 和 SHA1 哈希:len = 4 0000: 0E 00 00 00 .... Thread-0,处理异常:javax.net.ssl.SSLKeyException: RSA premaster secret error %% 无效:[会话 1,TLS_RSA_WITH_AES_128_CBC_SHA256] 12:41:01.684 [Thread-0] 错误 cppciSslContextTestContainer - 意外异常 javax.net.ssl.SSLKeyException:RSA premaster secret 错误 在 sun.security.ssl.RSAClientKeyExchange.(RSAClientKeyExchange.java:86) ~[na:1.8.0_25] 在 sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:880) ~[na:1.8.0_25] 在 sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:344) ~[na:1.8.0_25] 在 sun.security.ssl.Handshaker.processLoop(Handshaker.java:936) ~[na:1.8.0_25] 在 sun.security.ssl.Handshaker.process_record(Handshaker.java:871) ~[na:1.8.0_25] 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1043) ~[na:1.8.0_25] 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343) ~[na:1.8.0_25] 在 sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:728) ~[na:1.8.0_25] 在 sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) ~[na:1.8.0_25] 在 java.io.OutputStream.write(OutputStream.java:75) ~[na:1.8.0_25] 在 com.polycom.pillars.certificate.internal.SslContextTestContainer$ClientThread.doit(SslContextTestContainer.java:193) ~[bin/:na] 在 com.polycom.pillars.certificate.internal.SslContextTestContainer$SslConnectionThread.run(SslContextTestContainer.java:127) ~[bin/:na] 引起:java.security.NoSuchAlgorithmException:没有这样的算法:SunTls12RsaPremasterSecret for provider SunPKCS11-NSS 在 sun.security.jca.GetInstance.getService(GetInstance.java:101) ~[na:1.8.0_25] 在 javax.crypto.JceSecurity.getInstance(JceSecurity.java:109) ~[na:1.8.0_25] 在 javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:287) ~[na:1.8.0_25] 在 sun.security.ssl.JsseJce.getKeyGenerator(JsseJce.java:274) ~[na:1.8.0_25] 在 sun.security.ssl.RSAClientKeyExchange.(RSAClientKeyExchange.java:77) ~[na:1.8.0_25]