将 PKIXValidator 与 BouncyCastleFipsProvider 一起用于服务器证书验证?

Using PKIXValidator with BouncyCastleFipsProvider for server certificate validation?

我们在 JDK 1.8 上有一个基于 Apache Tomcat 的 Java 网络应用程序 运行,最近不得不加强其与安全相关的功能以符合某些法规,因此我们现在使用 BouncyCastleFipsProvider 作为 JVM 的主要安全提供程序,按照 BC 文档中的建议在 java.security 中配置:

security.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
security.provider.2=com.sun.net.ssl.internal.ssl.Provider BCFIPS
security.provider.3=sun.security.provider.Sun 

我现在面临通过 HTTPS 调用我们的第三方服务之一的问题,因为无法验证其证书链。我们得到的异常是:

Caused by: sun.security.validator.ValidatorException: End user tried to act as a CA
        at sun.security.validator.SimpleValidator.checkBasicConstraints(SimpleValidator.java:320)
        at sun.security.validator.SimpleValidator.checkExtensions(SimpleValidator.java:237)
        at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:221)
        at sun.security.validator.Validator.validate(Validator.java:262)
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)

这个 HTTPS 调用过去工作正常,所以我调试了 SSL 握手并注意到在以前的(工作)版本(Sun 安全提供程序的默认 JVM 安全设置)中验证是通过另一个 class:sun.security.validator.PKIXValidator。 在当前(不工作)设置中,SSLContext 由上面列表中的第二个提供程序提供,即 "Sun JSSE provider (FIPS mode, crypto provider BCFIPS)"

我对 JCE、JSSE、Bouncy Castle 没有深入的了解,所以我想知道是否有人知道这个 PKIXValidator 是否可以与 com.sun.net.ssl.internal.ssl.Provider(“BCFIPS”) 一起使用以验证服务器证书? 如果是,我该如何启用它?

更新: 我们还在 java.security 文件中设置了以下参数,我在我们的一份文档中找到的原因是:"PKIX is not available as a trust manager algorithm." 我认为这是我应该仔细检查的内容。

ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=SunX509

更新 2: 我尝试将上述算法属性设置为 PKIX,成功了,现在可以建立 HTTPS 连接了。

注意:该第三方证书有效,其链受浏览器信任,由知名根CA颁发。问题是他们在链中发送了两次自己的证书,这使得 SimpleValidator 失败。

奖金问题:上面列表中的前两个提供商有什么区别?

提前致谢。

在 java.security 中设置这些参数解决了问题:

ssl.KeyManagerFactory.algorithm=PKIX
ssl.TrustManagerFactory.algorithm=PKIX

另请参阅:https://bugs.openjdk.java.net/browse/JDK-8169745