1

我们正在尝试让 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 版本中得到支持

以下是目前收集到的证据:

  1. 尝试使用 TLS1.2 时发生的错误是 java.security.NoSuchAlgorithmException: no such algorithm: SunTls12RsaPremasterSecret for provider SunPKCS11-NSS。在这篇文章中讨论了一个相同的错误消息,并表明这意味着不支持 TLS 1.2。
  2. NSS 的 FIPS 验证最后一次是在 2010 年在 NSS 版本 3.12.14 上执行的。在 3.15.1 之前的任何 NSS 发行说明中都没有提到 TLS1.2 支持。此处发布了一个相关问题,但没有具体提及 TLSv1.2。
  3. CentOS 6.5 发行说明中表示支持 FIPS 模式和 TLS1.2,但没有提及是否同时支持这两者。
  4. 当系统不在 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]
4

2 回答 2

3

事实上,提供商不支持 TLS1.2。跟踪此问题的错误是: https ://bugs.openjdk.java.net/browse/JDK-8029661

于 2015-04-03T15:41:34.690 回答
0

由于服务器仍然尝试在 TLS1.2 中进行协商,即使提供者 NSS 不支持,也会出现异常。要避免此异常并继续使用 TLS1.1,请在 java.security 下添加以下行。

jdk.tls.disabledAlgorithms=SSLv3,TLSv1.2

于 2015-03-31T07:18:09.510 回答