2011-01-13 6 views
5

Ich bin neu in Android und ich habe Schwierigkeiten, einen SSL-Webdienst für eine Android-Anwendung anzurufen. Mein Code ist wie folgt:Wie rufe ich einen sicheren (SSL) Webservice in Android auf, wenn Android das Zertifikat nicht sieht?

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

Die Ausgabe lautet:

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

Irgendwelche Vorschläge, diese Arbeit zu machen, wäre toll.

Ich sollte beachten, dass dies ein gültiges Zertifikat ist. Es ist von einer offiziellen Zertifizierungsstelle signiert.

+0

Sind die SSL-Zertifikate gültig oder verwenden Sie einen dev-Server? –

+0

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

+0

Ich habe das gleiche Problem hast du, hast du eine funktionierende Lösung gefunden Dies ? –

Antwort

0

Auch ich denke, das ist ein Problem mit dem Zertifikat des Servers. Bitte sehen Sie sich das Programm InstallCert.java an, das Sie hier finden: http://blogs.oracle.com/andreas/entry/no_more_unable_to_find. Dies kann eine gute Möglichkeit sein, das Serverzertifikat zu überprüfen. Wenn Sie das nicht mit diesem Programm herunterladen können, würde ich sagen, überprüfen Sie Ihren Server erneut.
Veröffentlichen Sie Ihre Ergebnisse nach der Verwendung dieses Programms hier, und wir werden es von dort aus nehmen.

+1

Ich kompilierte und führte das Programm, die Ausgabe: Starten von SSL-Handshake ... Keine Fehler, Zertifikat ist bereits vertraut – mmattax

+0

Haben Sie versucht, den Link, den ich Ihnen gesendet, um SSL-Validierung zu deaktivieren. Wenn das funktioniert, dann weißt du, was das Problem ist. Ich erinnere mich, godaddy's ssl certs waren irgendwie funky. –

+0

Der Link ist tot, können wir ihn woanders finden? –

-10

Ich nehme an, Sie können nicht in HTTPS Webservice haben. Nur Methode erlaubt ist POST das versuchen und sehen.

+3

Woher hast du das? Kennst du das oder vermutest du es nur? Tatsächlich sind sogar für HTTPS alle Standard-HTTP-Methoden erlaubt. Wenn GET nicht erlaubt wäre, könnten Sie keine Webseite in Ihrem Browser bekommen, wenn Sie über HTTPS darauf zugreifen. – sven

+4

Diese Antwort ist so falsch, dass ich wünschte, ich hätte noch einen Downvote dafür. –

+1

HTTPS und POST sind zwei verschiedene Dinge in verschiedenen Schichten. – prageeth

1

Versuchen Sie Folgendes. Ich habe SSLSocketFactory hinzugefügt, um SSL-Verbindungen zu handhaben, und es bietet Unterstützung für die gleichzeitige Verarbeitung mehrerer Verbindungen mit ThreadSafeClientConnManager. Sie können Socket-Timeout und Verbindungstimeouts entfernen.

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

Hoffe, das hilft.

Wenn Ihr Client dem Serverzertifikat nicht vertraut, registrieren Sie ein anderes Protokoll und akzeptieren alle Zertifikate für dieses Protokoll. Sie sollten das Protokoll zuerst registrieren, bevor Sie etwas tun.

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

dann statt "https" Sie haben zu verwenden "mxiss"

EasySSLProtocolSocketFactory von org.apache.commons.httpclient.contrib.ssl kommt. Setzen Sie die JAR-Datei http://repo1.maven.org/maven2/ca/juliusdavies/not-yet-commons-ssl/0.3.11/not-yet-commons-ssl-0.3.11.jar in Ihren Klassenpfad.

+0

Ich habe das gleiche Problem und Ihre Lösung scheint keine Auswirkungen zu haben :-(. – Carsten

+0

Ich habe die Antwort aktualisiert. Bitte versuchen Sie es erneut. – prageeth

+1

In meinem Fall stellte sich heraus, dass das Problem war, dass mein Android-Gerät nicht der Wurzel vertraut Zertifikat von der CA. Firefox auf Android scheint seine eigenen Root-Zertifikate zu verwenden und Windows vertraut auch darauf, aber Apps, die die standardmäßigen vertrauenswürdigen CAs für das Gerät verwenden, haben ein Problem. – Carsten

2

Haben Sie testen, ob das mobile Datum und Stunde die richtigen sind ??, wenn Sie im Jahr 1990 SSL und haben Ihr Handy verwenden es

javax.net.SSLPeerUnverifiedException zurück: Kein Peer-Zertifikat

Grüße

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); 
Verwandte Themen