web-dev-qa-db-ja.com

例外:javax.net.ssl.SSLPeerUnverifiedException:ピアが認証されていません

public HttpClientVM() {

    BasicHttpParams params = new BasicHttpParams();
    ConnManagerParams.setMaxTotalConnections(params, 10);
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setUseExpectContinue(params, false);
    HttpConnectionParams.setStaleCheckingEnabled(params, true);
    HttpConnectionParams.setConnectionTimeout(params, 30000);
    HostnameVerifier hostnameVerifier=
          org.Apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
    HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
    SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
    socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http",socketFactory, 80));
    schemeRegistry.register(new Scheme("https",socketFactory, 443));
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);
        // Set verifier     
        client = new DefaultHttpClient(manager, params);    
    }

問題:

client.accessURL(url)を実行すると、次のエラーが発生します。

Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at com.Sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.Java:352)
    at org.Apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.Java:128)
    at org.Apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.Java:397)
    at org.Apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.Java:495)
    at org.Apache.http.conn.scheme.SchemeSocketFactoryAdaptor.connectSocket(SchemeSocketFactoryAdaptor.Java:62)
    at org.Apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.Java:148)
    at org.Apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.Java:150)
    at org.Apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.Java:121)
    at org.Apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.Java:575)
    at org.Apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.Java:425)
    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)

追加情報:

  • ウィンドウ7
  • HttpClient 4
45
Liu

期限切れの証明書が「javax.net.ssl.SSLPeerUnverifiedException:peer not authentication」の原因でした。

keytool -list -v -keystore filetruststore.ts

    Enter keystore password:
    Keystore type: JKS
    Keystore provider: Sun
    Your keystore contains 1 entry
    Alias name: somealias
    Creation date: Jul 26, 2012
    Entry type: PrivateKeyEntry
    Certificate chain length: 1
    Certificate[1]:
    Owner: CN=Unknown, OU=SomeOU, O="Some Company, Inc.", L=SomeCity, ST=GA, C=US
    Issuer: CN=Unknown, OU=SomeOU, O=Some Company, Inc.", L=SomeCity, ST=GA, C=US
    Serial number: 5011a47b
    Valid from: Thu Jul 26 16:11:39 EDT 2012 until: Wed Oct 24 16:11:39 EDT 2012
26
buzz3791

このエラーは、サーバーに有効なSSL証明書がないためです。したがって、クライアントに別のTrustManagerを使用するように指示する必要があります。サンプルコードを次に示します。

SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {

    public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
    }

    public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
    }

    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
};
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = base.getConnectionManager();
SchemeRegistry sr = ccm.getSchemeRegistry();
sr.register(new Scheme("https", 443, ssf));

client = new DefaultHttpClient(ccm, base.getParams());
12
bnguyen82

この例外は、サーバーがJDK 7に基づいており、クライアントがJDK 6にあり、SSL証明書を使用している場合に発生します。 JDK 7ではsslv2helloメッセージハンドシェイクはデフォルトで無効になっていますが、JDK 6ではsslv2helloメッセージハンドシェイクが有効になっています。このため、クライアントがサーバーに接続しようとすると、sslv2helloメッセージがサーバーに送信され、sslv2helloメッセージが無効になっているため、この例外が発生します。これを解決するには、クライアントをJDK 7に移動するか、6u91バージョンのJDKを使用する必要があります。ただし、このバージョンのJDKを取得するには、MOS(My Oracle Support)Enterpriseサポートを取得する必要があります。このパッチは公開されていません。

12
Tanuj Kumar

これは、クライアントが「https」を指定しているが、サーバーが「http」のみを実行している場合に取得できます。そのため、サーバーは安全な接続を確立することを期待していません。

5

これは、HTTPS経由で接続しようとしていて、サーバーがSSL接続を正しく処理するように構成されていない場合にも発生する可能性があります。

アプリケーションサーバーのSSL設定を確認し、証明書が正しく構成されていることを確認します。

3
Casey

私の場合、JDK 8クライアントを使用しており、サーバーは安全でない古い暗号を使用していました。サーバーはApacheであり、Apache構成に次の行を追加しました。

SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:!MEDIUM:!LOW:!SSLv2:!EXPORT

SSL構成が現在安全であることを確認するには、次のようなツールを使用する必要があります。 https://www.ssllabs.com/ssltest/analyze.html

0
Sarel Botha