我之前遇到过这个问题,并通过更新我的JDK来解决这个问题。早些时候,当我遇到这个问题时,我使用的是默认安装,我使用Yum进行了安装,之后我从oracle下载了JDK并安装了它,并根据新的安装目录更改了默认的$ JAVA_HOME路径。现在重新发生了同样的问题,我检查了related post on the net无法找到任何修复程序。
我们使用的示例代码只是对http或https的简单身份验证。
//Http client object
HttpClient client = new HttpClient();
HostConfiguration config = client.getHostConfiguration();
client.getParams().setParameter("http.socket.timeout", new Integer(100000));
String Url = 'https://example.com/';
PostMethod method = new PostMethod(Url);
//Handler to try for 3 attempt in case of network failure
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false));
//Here we are trying to connect through Httpclient method
int statusCode = client.executeMethod(method);
不确定导致此问题的原因。
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 76 entries
我做了一些测试并重新安装了我的jdk和tomcat,但仍然遇到了同样的错误。
Failure-Fatal transport error:
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
我按照URL:
上的说明进行操作java InstallCert services.example.com
Loading KeyStore jssecacerts...
Opening connection to services.example.com:443...
Starting SSL handshake...
No errors, certificate is already trusted
Server sent 1 certificate(s):
1 Subject CN=*.example.com, OU=Domain Control Validated, O=*.example.com
Issuer SERIALNUMBER=04343339, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
这表明证书已添加到cacerts中。现在这变得越来越有趣了。
答案 0 :(得分:3)
最后,在成员的所有麻烦和帮助之后,我得到了解决此问题的方法。我将提供我的答案,以防将来任何一个人面临同样的问题。
服务器services.example.com使用通配符证书(在我的情况下),并且在SSL握手期间(根据我的最佳理解)没有发送完整的证书,这导致了这个问题。
要修复此类问题,我们需要将证书添加到java truststore“cacerts”。
1:我从网址http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target下载了一段java代码 我把这个文件放在服务器上的位置“$ JAVA_HOME / jre / lib / security / cacerts”
2:我使用“javac InstallCerts.java”编译了代码,该代码创建了一个类文件。
3:然后执行以下命令为服务器“services.example.com”添加证书
java InstallCert services.example.com
Enter certificate to add to trusted keystore or 'q' to quit: [1]
1
我输入“1”将证书添加到信托文件“jssecacerts”。
4:最后我用文件“jssecacerts”替换了文件“cacerts”。 (注意:在替换之前备份这两个文件)
mv cacerts cacerts-bkp-12-Feb-2013
cp –p jssecacerts cacerts
5:确认证书已添加到cacerts文件中。要确认它,请执行以下命令:
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | grep example
Enter keystore password:
services.example.com-1, Feb 12, 2013, trustedCertEntry,
6:重新启动相关服务并测试了问题,并且已修复。
答案 1 :(得分:1)
您的信任库不信任服务器证书。它是自签名的吗?您可能需要将其从服务器导出到您的信任库。
答案 2 :(得分:0)
因此,也许有人会遇到这个问题,这是一个令人沮丧的问题,我花了两天时间才能找到并解决。问题在于,JVM不信任服务器的证书,因此,解决方案是将我们的Tomcat服务器和JVM配置为信任此站点。所以我将提到解决问题的所有步骤:
keytool -J-Duser.language = zh-CN -import -trustcacerts -alias somealiasexp -keystore cacerts-文件server_cert.crt
密码更改 您应该在命令行中得到肯定的确认。 要检查是否已添加证书,请执行以下命令:
keytool -list -keystore cacerts -alias somealiasexp
。并显示证书。
set JAVA_OPTS =“-Djavax.net.ssl.trustStore = C:/ Program 文件/Java/jre1.8.0_151/lib/security/cacerts” “ -Djavax.net.ssl.trustStorePassword = changeit”
keytool -genkey -alias tomcat -keyalg RSA -keystore tomcatkeystore.jks 执行此命令后,您将不必设置密码,我们假设它是“ some_password”。
keytool -certreq -keyalg RSA -alias tomcat-文件certtomcat.csr -keystore tomcatkeystore.jks
keytool -J-Duser.language = zh-CN -import -trustcacerts -alias somealias -keystore tomcatkeystore.jks-文件server_cert.crt
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="file:///C:/tomcatkeystore/tomcatkeystore.jks" keystorePass="some_password" />
要测试ssl端口是否配置正确,您应该能够访问链接“ https://localhost”中的tomcat接口并为其添加例外。就是这样,我希望这对您有所帮助。