我有两个https Web应用程序app1和app2安装在两个不同的tomcats t1和t2(t1和t2在不同的机器上).当我在app1中建立到app2的url连接时,我得到了SSL握手错误.原因是我在app2中使用自签名证书,这在app1 jvm truststore中不存在.因此,正确的修复方法是在JAVA-HOME/jre/lib/security中安装自签名证书.为此,我遵循了http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/中给出的步骤.不同论坛建议采取相同的步骤.但我仍然得到相同的SSL握手错误
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.
provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
虽然我通过在JVM信任中提到以下参数来摆脱这个SSLHandshakeException.-Djavax.net.ssl.trustStore = C:.keystore -Djavax.net.ssl.trustStorePassword = changeit
我的问题是为什么第一种方法(这是正确的方法),即将jssecacerts文件放在/ lib/security下不起作用? 另一点是第一种和第二种方法有什么不同?
虽然我通过在JVM信任中提到以下参数来摆脱这个SSLHandshakeException.-Djavax.net.ssl.trustStore = C:.keystore -Djavax.net.ssl.trustStorePassword = changeit
目前尚不清楚你试图用这些选项做什么.您可以使用默认信任库(通常jssecacerts,如果它存在;否则,cacerts)或您指定自己的信任库..keystore往往用作密钥库,而不是信任库(尽管没有默认的JSSE值).(C:.keystore顺便说一下,我也会指定完整路径而不是.)
最好制作原始cacerts(或jssecacerts)文件的副本(删除你已经添加的额外文件,如果你改变了一些东西)并将远程证书添加到它(即app2的副本app2的证书和app2的app1的证书复制,如果需要).
您可以使用列出证书keytool -list -keystore keystore.jks(如果需要,请参阅帮助以获取更多选项).
您可以使用导出证书keytool -export -keystore server1-keystore.jks -alias server_alias -file server1.crt.
然后,将其导入另一个信任库:keytool -import -keystore client2-truststore.jks -file server1.crt.(这里,client2-truststore.jks将是.的副本cacerts.)然后,配置运行Apache Tomcat的JVM(不一定是Tomcat连接器)来使用它.您应该能够在catalina.sh(JAVA_OPTS=-D...)中设置JVM参数.
编辑:
我的问题是为什么第一种方法(这是正确的方法),即将jssecacerts文件放在/ lib/security下不起作用?
为了更直接地回答您的问题,我只是仔细检查了一个干净的Oracle JRE 6安装(1.6.0_31),并且jssecacerts优先于cacerts当前(如JSSE Ref Guide中所述,所以似乎没有一个bug).我不确定Oracle在哪里移动了Andreas Sterbenz的Sun博客,所以我不确定InstallCert你使用过哪个副本.我想我的错在那里.
据我所知,InstallCert连接到服务器以获取其证书(替换上面的导出步骤):您有效地假设您在第一次连接上获得的证书是正确的(并且可以信任).您也可以使用OpenSSL获取该证书.但是,在您的情况下,您似乎可以控制两个服务器及其各自的密钥库,因此您可以使用keytool -export以确保.
另一点是第一种和第二种方法有什么不同?
第一种方法(更改jssecacerts)为将使用此JRE安装的所有应用程序设置配置,而第二种方法仅在运行Apache Tomcat时将这些设置应用于JVM.
请注意,如果您没有jssecacerts但只有一个cacerts文件,如果您只导入您的证书jssecacerts,cacerts将被忽略,因此您将无法连接到具有通常由CA颁发的证书的服务器默认值得信任.这就是为什么从默认文件的副本开始可能是有用的.(此外,如果您的应用程序还连接到默认情况下通常可信任的其他站点,这也可以解释为什么这次会在不同的地方收到此错误消息.)
最终,您有责任检查其中的内容jssecacerts或cacerts:
重要说明:JDK在/ lib/security/cacerts文件中附带有限数量的受信任根证书.如keytool中所述,如果您将此文件用作信任库,则您有责任维护(即添加/删除)此文件中包含的证书.
根据您联系的服务器的证书配置,您可能需要添加其他根证书.从相应的供应商处获取所需的特定根证书.
| 归档时间: |
|
| 查看次数: |
18559 次 |
| 最近记录: |