【发布时间】: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