【问题标题】:Using PKIXValidator with BouncyCastleFipsProvider for server certificate validation?使用 PKIXValidator 和 BouncyCastleFipsProvider 进行服务器证书验证?
【发布时间】:2019-02-20 20:16:19
【问题描述】:

我们有一个基于 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 失败。

额外问题:上面列表中的前两个提供者之间有什么区别?

提前致谢。

【问题讨论】:

  • SSL/TLS 的证书验证器不是由 SSLContext 本身控制,而是由从 SSLContext 链接的 TrustManager(通常是 X509TrustManagerImpl)控制。如果有任何在上下文中设置信任管理器的代码,请查看(也许调试)您的代码;如果未设置,则默认使用 PKIX(而不是 Simple)但验证安全属性(不是系统属性)java.security.ssl.TrustManagerFactory.algorithm
  • 感谢您的评论戴夫。我已经检查过了,似乎我们在那里明确设置了 SunX509,我已经用它更新了 OP。

标签: java https bouncycastle fips jsse


【解决方案1】:

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

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

另见:https://bugs.openjdk.java.net/browse/JDK-8169745

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多