web-dev-qa-db-ja.com

例外javax.net.ssl.SSLPeerUnverifiedException:peer not authenticationが発生するのはなぜですか?

私は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​​証明書が含まれています。ユーザー名とパスワードは空白の値です。

これは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

これは動作していないサンプルコードスニペットです。

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();
}
26
Sravan

例外メッセージ

javax.net.ssl.SSLPeerUnverifiedException:認証されていないピア

問題の根本原因を常に示すとは限りません。 Java VM parameter -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による答えが問題を解決します。

25
Binu George

上記のように、証明書をインポートします

  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 /

5

SSL接続の問題により、このエラーが発生する可能性があります。

私の解決策の1つは、Javaを6から8にアップグレードすることです。問題は、通信するサーバーがTLS 1.0のサポートを停止することです。そしてJava 6 TLS 1.0の上位バージョンをサポートします。アップデート後Java(アップグレードdropwizardがなくても)動作します。

1
Yu Zhu

サーバーURLがhttpではなくhttpsを使用することになっていることを確認してください。 http URLへの安全な接続を設定しようとすると、このエラーが発生する可能性があります。

0