【问题标题】:Why am I getting an exception javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated?为什么我收到异常 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated?
【发布时间】:2011-09-10 17:03:46
【问题描述】:

我正在使用 Apache HttpComponents HttpClient(4.0.1) 进行 HTTPS 调用,但我将这个异常作为响应:

 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
        at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:345)
        at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)

我提供了所有必需的参数。目标系统不需要任何用户名/密码或代理,但它包含安装在服务器中的 JKS csrtificates。用户名和密码为空值。

这适用于org.apache.commons.httpclient.methods.PostMethod - 版本 3.0 - commons-httpclient-3.0.jar 现在我们已经实现了org.apache.http.client.methods.HttpPost - 版本 4.0.1 - commons-httpclient.jar

这是无效的示例代码 sn-p:

HttpParams param = new BasicHttpParams();
HttpProtocolParams.setVersion(param, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(param, "UTF-8");
HttpProtocolParams.setUseExpectContinue(param, true);
DefaultHttpClient httpClient = new DefaultHttpClient(param);
httpClient.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT,10000)));
httpClient.getParams().setParameter(HttpConnectionParams.SO_TIMEOUT,10000)));
httpClient.getCredentialsProvider().setCredentials(new AuthScope(<HOST IP,PORT)),
    AuthScope.ANY_REALM),
    new UsernamePasswordCredentials("", ""));

try {
HttpPost httpPost = new HttpPost(END POINT URL);
StringEntity requestEntity = new StringEntity(inputString, "text/xml", "UTF-8");
httpPost.setEntity(requestEntity);
response = httpClient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
if (null != responseEntity) 
{
    responseBody = EntityUtils.toString(responseEntity);
}
if (null != httpPost.getURI()) {
    url = httpPost.getURI().toString();
}
} catch (IOException e) {
    e.printStackTrace();
} finally {
   httpClient.getConnectionManager().shutdown();
}

【问题讨论】:

    标签: java ssl https apache-httpclient-4.x


    【解决方案1】:

    如上所述,您可以导入证书

    1. 在您放置证书的目录(例如 XYZ.cer)中启动命令提示符
    2. 运行以下命令只需更改活动的 jre 路径(请注意 ~ 符号)
    3. keytool -import -alias XYZ -file XYZ.cer -keystore C:/Program~1/Java/jdk1.6.0_23/jre/lib/security/cacerts -storepass changeit

                                 OR
      

    使用您自己的信任管理器 http://tech.chitgoks.com/2011/04/24/how-to-avoid-javax-net-ssl-sslpeerunverifiedexception-peer-not-authenticated-problem-using-apache-httpclient/

    【讨论】:

      【解决方案2】:

      异常消息

      javax.net.ssl.SSLPeerUnverifiedException:对等体未通过身份验证

      并不总是指出问题的根本原因。 您可能需要通过添加 Java VM 参数-Djavax.net.debug=ssl:handshake 来启用 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
      

      如果是这样,那么@Abhishek 的回答将解决问题。

      【讨论】:

        【解决方案3】:

        确保服务器 URL 应该使用 https 而不是 http。尝试建立与 http URL 的安全连接时,您可能会收到此错误。

        【讨论】:

          【解决方案4】:

          任何 SSL 连接问题都可能导致此错误。

          我的解决方案之一是将 java 从 6 升级到 8。 我们的问题是我们要通信的服务器停止支持 TLS 1.0。而且java 6不支持TLS 1.0的更高版本。更新 Java 后(即使没有升级 dropwizard)它也可以工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-18
            • 1970-01-01
            • 1970-01-01
            • 2014-03-21
            • 1970-01-01
            • 2010-12-09
            相关资源
            最近更新 更多