2012-08-04 13 views
7

mio progetto Android sta usando api 15. Sto collegando a un server tramite HTTPS utilizzando la classe HttpsURLConnection. Tutto funziona bene su WiFi, ma se spengo WiFi e corro su reti 3G ottengo il seguente:Trust for percorso del certificato non trovato quando si utilizza su reti 3G, ma funziona bene su WiFi

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:413) 
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)  at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210) 
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477) 
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) 
    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
    at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)  at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280) 

Se sto facendo qualcosa di sbagliato, perché dovrebbe lavorare su WiFi?

Un po 'più informazioni qui.

Se uso OpenSSL per visualizzare le informazioni certificato del server,

echo | openssl s_client -connect myserver.com:443 

restituisce una a livello di server cert auto-firmato, mentre

echo | openssl s_client -connect myserver.com:443 -servername myserver.com 

restituisce il certificato 'corretta'. Ho più vhosts sul mio server, ognuno con il proprio cert rapidssl, quindi penso 'questo significa che ho bisogno di usare un client abilitato per TLS. ci

Name-based SSL virtual hosts only work for clients with TLS server name indication support 

Se ho ragione finora, vuol dire che la mia rete mobile 3G potrebbe essere scopa con il TLS o è qualcosa di diverso: Almeno questa è la mia interpretazione del messaggio che vedo nel mio log di Apache all'avvio Dovrei fare?

I può può far funzionare le cose oltre 3g sottoclasse DefaultHttpClient e importare un keystore contenente il server autofirmato cert ma questa non è sicuramente la mia opzione preferita.

+0

Qual è l'URL del server? – jww

risposta

0

L'aggiunta dell'opzione -servername imposta semplicemente il campo Server Name Indication nel messaggio Client Hello che ci aiuta a selezionare il certificato corretto se l'host di destinazione ne contiene molti, proprio come nel tuo caso. Tuttavia, non è correlato al problema.

Durante handshake SSL, certificati vengono consegnati a coppie soggetto/emittenti, formando una catena di certificati.

I.e. google.com catena di certificati è simile al seguente:

openssl s_client -connect google.com:443 
CONNECTED(00000003) 
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
verify error:num=20:unable to get local issuer certificate 
verify return:0 
--- 
Certificate chain 
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com 
    i:/C=US/O=Google Inc/CN=Google Internet Authority G2 
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2 
    i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
    i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
--- 

Una volta ricevuto, il client tenta di convalidare tutti gli emittenti della catena dal basso verso l'alto (root). Se il client non è in grado di convalidare il certificato di root, viene visualizzato il messaggio Trust anchor for certification path not found.

Quindi, tornando alla questione di WiFi/3G, probabilmente DNS della rete mobile potrebbe non risolvere l'indirizzo di uno dei intermediari emittenti nella vostra catena di certificati.

UPDATE:

È possibile inserire i certificati vostre emittenti nella vostra APK e aggiungere via TrustManager nel codice. Questo approccio può superare le restrizioni della rete di accesso (se presenti).

+0

Che cosa ha esattamente a che fare il DNS con la convalida del certificato? – EJP

+0

Se uno dei certificati intermedi non è presente nel keystore della CA del dispositivo, con quale protocollo può trovare l'autorizzazione? Inoltre, controlla questa risposta: http://stackoverflow.com/questions/19220687/is-domain-name-of-the-server-checked-during-ssl-handshake –