2012-08-02 14 views
10

Sto chiamando un servizio REST utilizzando HTTPS su un'applicazione Android. Ho già un codice funzionante per questo, ma ora che sto usando un server appena installato che ospita il servizio REST, non riesco più a stabilire una connessione.Errore di protocollo sconosciuto con connessione HTTPS su Android

Qui è l'eccezione:

javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x15b7768: Failure in SSL library, usually a protocol error 
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x402e5cc3:0x00000000) 

L'applicazione utilizzare le classi di Apache per interagire con il servizio REST. Ottengo questo errore anche quando utilizzo un fittizio TrustManager che accetta qualsiasi tipo di certificato.

Quando si chiama il servizio REST da Android Navigator, la connessione viene stabilita correttamente e funziona correttamente.

Il telefono Android esegue l'ultimo Android 4.0.3 da HTC.

Il servizio REST è un'applicazione mod_perl ospitata su Apache configurato con il supporto SSL.

L'esplorazione del codice sorgente OpenSSL su https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c non fornisce alcun suggerimento oltre a un problema di basso livello.

Qualche suggerimento su come eseguire il debug di questo ulteriore?

+0

dupe possibile di: http://stackoverflow.com/questions/6735408/apache-commons-net-ssl-handshake-error-with-android – petey

+0

hai verificato che il nuovo server abbia installato correttamente il certificato SSL? – petey

+1

Connettiti anche con openssl s_client e vedi cosa sta mandando il server. –

risposta

17

Ok ho trovato qual è il problema.

Seguendo il suggerimento di utilizzare OpenSSL s_client mi ha fatto capire che utilizzo il numero di porta errato per la connessione. Il nuovo server utilizza la porta SSL standard che non era il caso dell'altro server che stavo usando in precedenza.

Poiché il server non rispondeva in base al protocollo SSL, la risposta non poteva essere decodificata in modo significativo da OpenSSL e quindi da Unknown Protocol Error.

Per le persone che vogliono sapere come ho usato OpenSSL s_client (nella shell fare):

$ openssl s_client -connect myhost.example.com:443 -tls1 -servername myhost.example.com 

L'opzione -servername arruola Server Name Indication (SNI) per garantire il server fornisce il certificato corretto se ci sono più siti ospitati presso il server. SNI è un'opzione TLS 1.0 (e sopra) e lo standard -tls1_1 e -tls1_2 di solito funziona anche.

Quindi viene visualizzato un carico di informazioni relative alla connessione SSL appena aperta.

+0

Vedere anche [Quali suite di crittografia abilitare per SSL Socket?] (Http://stackoverflow.com/a/23365536/608639). Java ha qualche cattivo comportamento nascosto nel suo 'SSLSocketFactory'; e 'SSLSocketFactoryEx' assicura che i protocolli e le suite di crittografia siano" accettabili "(con una definizione moderna di" accettabile "). – jww

Problemi correlati