【发布时间】:2021-05-24 17:33:45
【问题描述】:
为我的服务器应用程序使用 BouncyCastle FIPS JSSE 和 TLS 提供程序。
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-fips</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bc-fips</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bctls-fips</artifactId>
<version>1.0.10</version>
</dependency>
在应用程序中配置 FIPS 和 JSSE 提供程序,如下所示。
Security.insertProviderAt(new BouncyCastleFipsProvider(), 1);
Security.insertProviderAt(new BouncyCastleJsseProvider("fips:BCFIPS"), 2);
Security.setProperty("keystore.type", "BCFKS");
SSL证书配置如下:
Server Cert - Public Key: RSA 2048 bit, Sign Algorithm: SHA256WithRSA
Issuing CA - Public Key: RSA 2048 bit, Sign Algorithm: SHA256WithRSA
Root CA - Public Key: RSA 2048 bit, Sign Algorithm: SHA1WithRSA
使用 Zulu OpenJDK JRE 11。以下是与 TLS 相关的其他系统属性
-Djdk.tls.disabledAlgorithms="MD5, RC4, TLSv1, SSLv2Hello, SSLv3, DSA, DESede, DES, 3DES, DES40_CBC, RC4_40, MD5withRSA, DH, 3DES_EDE_CBC, DHE, DH keySize < 1024, EC keySize < 224" -Djdk.tls.ephemeralDHKeySize=2048 -Djdk.tls.rejectClientInitiatedRenegotiation=true -Djava.security.egd=file:/dev/./urandom -Dorg.bouncycastle.rsa.allow_multi_use=true
支持的协议是 TLSv1.2。
预期:
我希望服务器支持 TLS_ECDHE_RSA 类型的密码。当使用具有相同配置(减去上面的 BC 库)的 Sun JSSE 的相同应用程序时,这些密码被启用。
实际:
问题是在 SSL 扫描中仅显示 TLS_RSA 类型的密码如下:
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
在 bouncycastle 调试日志中,我看到以下条目
[o.b.j.p.ProvTlsServer] - Server found no credentials for cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
[o.b.j.p.ProvTlsServer] - Server found no credentials for cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[o.b.j.p.ProvTlsServer] - Server found no credentials for cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
[o.b.j.p.ProvTlsServer] - Server found no credentials for cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
[o.b.j.p.ProvTlsServer] - Server found no credentials for cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
[o.b.j.p.ProvTlsServer] - Server found no credentials for cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
这是什么意思?我没有从谷歌搜索中找到任何有用的信息。有人可以帮忙解决这个问题。
提前致谢。
可能的类似问题:DHE ciphers not exposed by BouncyCastle provider
Update-1
这是在将 ssl.KeyManagerFactory.algorithm 和 ssl.TrustManagerFactory.algorithm 设置为 PKIX 后的更新,如下面的答案所示。
感谢您建议该配置。现在 TLS_ECDHE_RSA* 密码出现在 SSL 扫描中。
但是有一个问题。受支持的密码列表还包括 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(请参阅屏幕截图),根据本文档(附录 B),FIPS 模式不支持该密码:https://downloads.bouncycastle.org/fips-java/BC-FJA-(D)TLSUserGuide-1.0.10.pdf。
我已经设置了系统属性-Dorg.bouncycastle.fips.approved_only=true,但是没发现有什么区别。
我不确定这是否符合预期。对此有什么想法吗?
其他观察:
一旦我按照上面的建议配置了 PKIX 算法,我很快就开始在 SSL 扫描后收到错误 org.bouncycastle.crypto.IllegalKeyException: Attempt to sign/verify with RSA modulus already used for encrypt/decrypt.。此错误阻止了与我的应用程序的所有后续 TLS 连接。为此,我尝试了以下两种方法。
-
按照this forum 中的说明设置
-Dorg.bouncycastle.jsse.fips.allowRSAKeyExchange=false。但是,这会禁用所有 TLS_RSA 密码。 -
配置了系统属性
-Dorg.bouncycastle.rsa.allow_multi_use=true。有了这个,我可以同时使用 TLS_RSA 和 TLS_ECDHE_RSA 密码。
【问题讨论】:
标签: ssl bouncycastle jce fips jsse