我们有一个运行在JDK 1.8上的基于Apache Tomcat的Java Web应用程序,最近不得不加强其与安全性相关的功能以符合某些法规,因此我们现在将 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
UPDATE2: 我尝试将上述算法属性设置为PKIX,就可以了,现在可以建立HTTPS连接了。
注意:此第三方的证书有效,其链受浏览器信任,并由著名的根CA颁发。问题是他们在链中两次发送了自己的证书,这使SimpleValidator失败了。
奖励问题:上面列表中的前两个提供者有什么区别?
谢谢。
答案 0 :(得分:0)
在java.security中设置这些参数可以解决此问题:
ssl.KeyManagerFactory.algorithm=PKIX
ssl.TrustManagerFactory.algorithm=PKIX