1

我之前遇到过这个问题,并通过更新我的 JDK 来解决这个问题。早些时候,当我遇到这个问题时,我使用的是使用 Yum 进行的默认安装,后来我从 oracle 下载了 JDK 并安装了它,并根据新的安装目录更改了默认的 $JAVA_HOME 路径。现在同样的问题又出现了,我查了网上的相关帖子,找不到任何解决办法。

我们使用的示例代码只是通过 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

2013 年 2 月 11 日编辑

我做了一些更多的测试并重新安装了我的 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 中。现在这变得越来越有趣了。

4

3 回答 3

5

最后,经过成员们的所有麻烦和帮助,我得到了解决这个问题的方法。我正在提供我的答案,以防将来有人面临同样的问题。

服务器 services.example.com 使用通配符证书(在我的情况下)并且它在 SSL 握手期间没有发送完整的证书(根据我的最佳理解),这导致了这个问题。

要解决此类问题,我们需要将证书添加到 java 信任库“cacerts”。

1:我从 URL http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target下载了一个java代码 我把这个文件放在服务器位于“$JAVA_HOME/jre/lib/security/cacerts”</p>

2:我使用“javac InstallCerts.java”编译了代码,它创建了一个类文件。

3:然后执行以下命令为服务器“services.example.com”添加证书</p>

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:重启相关服务并测试问题,已修复。

于 2013-02-12T17:05:36.797 回答
1

您的信任库不信任服务器证书。是自签吗?您可能需要将其从服务器导出到您的信任库中。

于 2013-01-31T07:40:00.363 回答
1

所以也许有人会遇到这个问题,这是一个令人沮丧的问题,我花了两天时间才找到并解决。问题是JVM不信任服务器的证书,所以解决方法是配置我们的Tomcat服务器和我们的JVM信任这个站点。所以我会提到解决问题的所有步骤:

  1. 下载该站点的证书,方法是打开其与 firefox 的链接,然后单击绿色锁,然后单击更多信息,然后是安全选项卡,查看证书按钮,然后是详细信息选项卡,最后是导出按钮。假设它被命名为 server_cert.crt
  2. 将证书添加到要信任的证书的 JVM 列表中:您应该能够通过导航到 C:\Program Files\Java\jre1.8.0_151\lib\security 来做到这一点。要更新的文件名为 cacerts,因此将下载的证书 server_cert.crt 复制到该文件夹​​,然后在同一位置打开命令行,然后执行命令:

keytool -J-Duser.language=en -import -trustcacerts -alias somealiasexp -keystore cacerts -file server_cert.crt

密码是changeit,你应该在命令行中有一个肯定的确认。要检查证书是否已添加,请执行以下命令:

keytool -list -keystore cacerts -alias somealiasexp

. 并且应该显示证书。

  1. 现在让我们配置我们的 tomcat 服务器以使用 cacerts 密钥库,进入文件夹“C:\Program Files\Java\apache-tomcat-7.0.88\bin”并创建文件“setenv.bat”,然后将这段代码复制到其中:

设置 JAVA_OPTS="-Djavax.net.ssl.trustStore=C:/Program Files/Java/jre1.8.0_151/lib/security/cacerts" "-Djavax.net.ssl.trustStorePassword=changeit"

  1. 另一方面,我们必须为包含密钥库和证书的 ssl 配置一个新的端口或连接器,所以:
  2. 创建一个新文件夹,例如“C:/tomcatkeystore”
  3. 进入文件夹并通过在 CMD 上执行命令来创建一个新的密钥库:

keytool -genkey -alias tomcat -keyalg RSA -keystore tomcatkeystore.jks 执行此命令时,您将不得不设置密码,假设它是“some_password”。

  1. 如果您想购买受信任的证书,您必须通过执行以下命令生成证书请求:

keytool -certreq -keyalg RSA -alias tomcat -file certtomcat.csr -keystore tomcatkeystore.jks

  1. 将下载的证书 server_cert.crt 复制到文件夹中,然后通过执行以下命令将其添加到生成的密钥库中:

keytool -J-Duser.language=en -import -trustcacerts -alias somealias -keystore tomcatkeystore.jks -file server_cert.crt

  1. 现在让我们通过复制此标记来更新位于文件夹“C:\Program Files\Java\apache-tomcat-7.0.88\conf”中的文件 server.xml:

<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" />

  1. 现在最后一步是重新启动您的服务器。

要测试是否正确配置了 ssl 端口,您应该能够访问链接“ https://localhost ”中的 tomcat 接口并为其添加异常。就是这样,我希望这会有所帮助。

于 2018-07-03T13:31:33.740 回答