Подтвердить что ты не робот

Исключение: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

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);    
    }

Window7, HttpClient4

при выполнении: 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)
4b9b3361

Ответ 1

Истекший сертификат был причиной нашего "javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated".

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

Ответ 2

Эта ошибка связана с тем, что на вашем сервере нет действительного сертификата 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());

Ответ 3

Это исключение произойдет, если ваш сервер основан на JDK 7, а ваш клиент находится на JDK 6 и использует SSL-сертификаты. В JDK 7 сообщение sslv2hello handshaking отключено по умолчанию, в то время как в JDK 6 sslv2hello сообщение об отказе включено. По этой причине, когда ваш клиент пытается подключиться к серверу, сообщение sslv2hello будет отправлено на сервер, и из-за отключения сообщения sslv2hello вы получите это исключение. Чтобы решить эту проблему, вы должны переместить своего клиента в JDK 7 или вам нужно использовать версию JuK версии 6u91. Но чтобы получить эту версию JDK, вы должны получить поддержку MOS (Моя поддержка Oracle) Enterprise. Этот патч не является общедоступным.

Ответ 4

Вы можете получить это, если клиент указывает "https", но сервер работает только "http". Таким образом, сервер не ожидает создания безопасного соединения.

Ответ 5

Это также может произойти, если вы пытаетесь подключиться через HTTPS, и сервер не настроен правильно обрабатывать SSL-соединения.

Я бы проверял настройки SSL вашего сервера приложений и убедился, что сертификация настроена правильно.

Ответ 6

В моем случае я использовал клиент JDK 8, и на сервере использовались небезопасные старые шифры. Сервер Apache, и я добавил эту строку в конфигурацию Apache:

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

Вы должны использовать такой инструмент, чтобы убедиться, что ваша конфигурация SSL в настоящее время защищена: https://www.ssllabs.com/ssltest/analyze.html

Ответ 7

если вы находитесь в режиме dev с недопустимым сертификатом, почему бы не просто установить weClient.setUseInsecureSSL(true). работает для меня

Ответ 8

Если вы находитесь в режиме dev с недопустимым сертификатом, почему бы не просто установить webClient.setUseInsecureSSL(true). Это работает для меня.