2011-01-13 9 views
5

Sono nuovo per Android e sto cercando di fare una chiamata a un servizio Web SSL per un'applicazione Android. Il mio codice è il seguente:Come si chiama un servizio web sicuro (SSL) in Android, quando Android non vede il certificato?

Log.v("fs", "Making HTTP call..."); 
HttpClient http = new DefaultHttpClient(); 
HttpGet request = new HttpGet("https://example.com/api"); 

try { 

    String response = http.execute(request, new BasicResponseHandler()); 
    Log.v("fs", response); 

} catch (Exception e) { 

    Log.v("fs", e.toString()); 
} 

l'output è:

Making HTTP call... 
javax.net.SSLPeerUnverifiedException: No peer certificate 

Eventuali suggerimenti per rendere questo lavoro sarebbe grande.

Devo notare che questo è un certificato valido. È firmato da una CA ufficiale.

+0

I certificati SSL sono validi o si sta utilizzando un server di sviluppo? –

+0

Forse questo http://stackoverflow.com/questions/3761737/https-get-ssl-with-android-and-self-signed-server-certificate –

+0

Ho lo stesso problema, hai trovato una soluzione funzionante per Questo ? –

risposta

0

Anch'io penso che questo sia un problema con il certificato del server. Pls controlla il programma InstallCert.java fornito qui: http://blogs.oracle.com/andreas/entry/no_more_unable_to_find. Questo può essere un buon modo per verificare il certificato del server. Se non puoi scaricare quello che usa questo programma, direi, verifica di nuovo il tuo server.
Pubblica i tuoi risultati dopo aver utilizzato questo programma qui, e lo prenderemo da lì.

+1

Ho compilato ed eseguito il programma, l'output: Avvio di handshake SSL ... Nessun errore, il certificato è già affidabile – mmattax

+0

Hai provato il collegamento che ti ho inviato per disabilitare la convalida SSL. Se funziona, allora sai qual è il problema. Ricordo che gli ssl certs di Godaddy erano un po 'funky. –

+0

Il link è morto, possiamo trovarlo altrove? –

-10

Suppongo che non sia possibile accedere al servizio web HTTPS. Solo il metodo consentito è POST provare e vedere.

+3

Da dove hai preso questo. Lo sai o stai solo indovinando. Infatti, anche per HTTPS sono consentiti tutti i metodi HTTP standard. Se GET non fosse consentito non saresti in grado di ottenere alcuna pagina web nel tuo browser quando accederai tramite HTTPS. – sven

+4

Questa risposta è così sbagliata che vorrei avere un altro downvote per questo. –

+1

HTTPS e POST sono due cose diverse in diversi livelli. – prageeth

1

Provare quanto segue. Ho aggiunto SSLSocketFactory per gestire le connessioni SSL, inoltre aggiunge il supporto per la gestione di più connessioni simultaneamente utilizzando ThreadSafeClientConnManager. È possibile rimuovere il timeout del socket e i timeout della connessione.

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443)); 

    HttpParams params = new BasicHttpParams(); 
    int timeoutConnection = 5000; 
    HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
    int timeoutSocket = 10000; 
    HttpConnectionParams.setSoTimeout(params, timeoutSocket); 
    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 
    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); 
    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

    _client = new DefaultHttpClient(cm, params); 

Spero che questo aiuti.

Se il client non si fida del certificato del server, registrare un protocollo diverso e accettare tutti i certificati per tale protocollo. Dovresti prima registrare il protocollo prima di fare qualsiasi cosa.

Protocol mxiss = new Protocol("mxiss", new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("mxiss", mxiss); 

Poi invece di "https" bisogna usare "mxiss"

EasySSLProtocolSocketFactory viene da org.apache.commons.httpclient.contrib.ssl. Inserisci il file jar http://repo1.maven.org/maven2/ca/juliusdavies/not-yet-commons-ssl/0.3.11/not-yet-commons-ssl-0.3.11.jar nel classpath.

+0

Ho lo stesso problema e la tua soluzione non sembra avere alcun impatto :-(. – Carsten

+0

Ho aggiornato la risposta. Riprova. – prageeth

+1

Nel mio caso si è scoperto che il problema era che il mio dispositivo Android non si fidava della root certificato dalla CA. Firefox su Android sembra utilizzare i propri certificati di origine e Windows si fida anche di esso, ma le app che utilizzano le CA di fiducia standard per il dispositivo presentano un problema. – Carsten

2

Avere si prova che la data e l'ora sono mobili quelli corretti ??, se si sta utilizzando SSL e hai il tuo cellulare nel 1990 tornerà

javax.net.SSLPeerUnverifiedException: Nessun certificato pari

Cordiali saluti

1
SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443)); 


HttpParams params = new BasicHttpParams(); 
int timeoutConnection = 5000; 
HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
int timeoutSocket = 10000; 
HttpConnectionParams.setSoTimeout(params, timeoutSocket); 

params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 

params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean); 

params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 


ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

_client = new DefaultHttpClient(cm, params); 
Problemi correlati