2012-03-06 12 views
28
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, HttpClient4eccezione: javax.net.ssl.SSLPeerUnverifiedException: pari non autenticato

quando eseguito: client.accessURL(url); si verifica:

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) 

risposta

8

Questo errore è dovuto al fatto che il server non dispone di un certificato SSL valido. Quindi dobbiamo dire al cliente di usare un TrustManager diverso. Ecco un esempio di codice:

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()); 
+5

In che modo rimuovere la sicurezza da questo punto risolve il problema dall'altra parte? Il codice di TrustManager non è nemmeno conforme alle specifiche. – EJP

+0

Non vedo il tuo punto. Il problema viene dal lato client, quindi abbiamo solo bisogno di cambiarlo. Quale linea di codice TrustManager non è conforme alle specifiche? – bnguyen82

+5

'getAcceptedIssuers()' è specificato per non restituire null. Il codice che hai postato è radicalmente insicuro. Non risolve alcun problema, crea solo un altro problema, ad esempio la vulnerabilità agli attacchi man-in-the-middle. – EJP

14

Certificato scaduto era la causa della nostra "javax.net.ssl.SSLPeerUnverifiedException: Peer non autenticata".

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 
+0

Perdonare la domanda "stupida", ma il certificato scaduto era sul lato server o sul lato client? – isapir

+0

@Igal Se richiamo accuratamente, il lato server. – buzz3791

1

Questo può succedere anche se si sta tentando di connettersi tramite HTTPS e il server non è configurato per gestire correttamente le connessioni SSL.

Vorrei verificare le impostazioni SSL dei server applicazioni e verificare che la certificazione sia configurata correttamente.

+1

Cosa può essere configurato in modo errato? Il certificato ssl funziona bene nel browser. Perché non funziona con Java? Perché Java è così speciale? –

-5

se si è in modalità dev con certificato non valido, perché non impostare solo weClient.setUseInsecureSSL(true). funziona per me

+0

Questo non è ciò che l'OP sta chiedendo –

6

Questa eccezione si verifica nel caso in cui il server sia basato su JDK 7 e il client sia su JDK 6 e utilizzi certificati SSL. In JDK 7 sslv2hello l'handshake dei messaggi è disabilitato di default mentre in JDK 6 è abilitato l'handshaking dei messaggi sslv2hello. Per questo motivo, quando il tuo client tenta di connettere il server, un messaggio sslv2hello verrà inviato al server e, a causa della disabilitazione del messaggio sslv2hello, otterrai questa eccezione. Per risolvere questo devi spostare il tuo client su JDK 7 o devi usare la versione 6u91 di JDK. Ma per ottenere questa versione di JDK devi ottenere il supporto per il MOS (My Oracle Support) Enterprise. Questa patch non è pubblica.

0

Nel mio caso stavo usando un client JDK 8 e il server utilizzava vecchi codici non sicuri. Il server è Apache e ho aggiunto questa linea alla configurazione di Apache:

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

Si dovrebbe usare uno strumento come questo per verificare la configurazione SSL è attualmente sicuro: https://www.ssllabs.com/ssltest/analyze.html

2

È possibile ottenere questo se previsto client "https" ma il server sta eseguendo solo "http". Quindi, il server non si aspetta di stabilire una connessione sicura.

Problemi correlati