java - 将 PKIXValidator 与 BouncyCaSTLeFipsProvider 一起用于服务器证书验证?

标签 java https bouncycastle fips jsse

我们有一个基于 Apache Tomcat 的 Java Web 应用程序运行在 JDK 1.8 上,最近必须加强其安全相关的功能以符合某些法规,因此我们现在使用 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 安全设置)中验证是用另一个类完成的:sun.security .validator.PKIXValidator。 在当前(不工作)设置中,SSLContext 由上面列表中的第二个提供者提供,即“Sun JSSE 提供者(FIPS 模式,加密提供者 BCFIPS)”

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

更新: 我们还在 java.security 文件中设置了以下参数,我在我们的一份文档中找到的原因是:“PKIX 不可用作信任管理器算法。”我相信这是我应该仔细检查的事情。

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

关于java - 将 PKIXValidator 与 BouncyCaSTLeFipsProvider 一起用于服务器证书验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54794570/

相关文章:

java - 如何以编程方式将 CSR 提交给认证机构?

java - 使用 Bouncy CaSTLe 签署 CSR

android - CertificateFactory 不从 InputStream 生成证书

java - 在 Java 中运行两次 GUI 应用程序

java - 如何使用 JSTL 遍历字符串中的每个字符?

c++ - 在使用带有 https 的 url 时,我遇到了 Casablanca C++ 的问题

ruby-on-rails-3 - 通过 https 访问站点会导致文件夹结构显示在浏览器中,而不是应用程序中

ssl - 双层反向代理如何通过无效的 SSL 证书?

java - Java中生产者-消费者代码的多线程没有给出正确的输出?

java - Java随机打乱列表