2012-08-12 2 views
24

Ich habe eine Website, die ich SSL für einen RESTful Service aktivieren. Wir haben uns bei RapidSSL registriert, die Zertifikate installiert und es übergibt die RapidSSL checker. Ich kann auf die Seite mit verschiedenen Browsern zugreifen, einschließlich der Android-Browser (eingebaut, Firefox und Opera) ohne Probleme, keine Warnungen.Android ssl: javax.net.ssl.SSLPeerUnverifiedException: Kein Peer-Zertifikat (schon wieder)

Allerdings, wenn ich versuche, es mit meinem Android App zuzugreifen, erhalte ich die folgende Ausnahme:

08-11 20:04:05.586 363 381 E HttpProvider: Error executing request: No peer certificate 
08-11 20:04:05.586 363 381 E HttpProvider: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:259) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-11 20:04:05.586 363 381 E HttpProvider: at com.xxxxx.netlib.http.HttpProvider.executeRequest(HttpProvider.java:75) 

Diese auf dem Emulator und auf einem 3,2 Tablet auf Android 2.3.3 auftritt. Ich habe viele Treffer dabei gesehen, aber nichts, was ich gefunden habe, hilft mir, das Problem zu beheben.

Weitere Daten:

$ openssl s_client -CAfile www.xxxxx.com.pem -connect www.xxxxx.com:443 
CONNECTED(00000003) 
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority 
verify return:1 
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
verify return:1 
depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA 
verify return:1 
depth=0 serialNumber = 1-7wArtEjdTwJ94d5iVDooDmmC4mXyVj, OU = GT82425783, OU = See www.rapidssl.com/resources/cps (c)12, OU = Domain Control Validated - RapidSSL(R), CN = www.xxxxx.com 
verify return:1 
--- 
Certificate chain 
0 s:/serialNumber=1-7wArtEjdTwJ94d5iVDooDmmC4mXyVj/OU=GT82425783/OU=See www.rapidssl.com/resources/cps (c)12/OU=Domain Control Validated - RapidSSL(R)/CN=www.xxxxx.com 
    i:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA 
1 s:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA 
    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 
--- 
[snip] 

Der Code, den ich laufen würde den Client einzurichten:

public class HttpProvider implements INetworkProvider { 
    private static final String LOG = "HttpProvider"; 
    protected DefaultHttpClient client; 

    public HttpProvider() { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
    sslSocketFactory.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
    registry.register(new Scheme("https", sslSocketFactory, 443)); 

    client = new DefaultHttpClient(
     new ThreadSafeClientConnManager((new BasicHttpParams()), registry), new BasicHttpParams() 
    ); 
    } 
[snip] 

Ich habe auch mit STRICT_HOSTNAME_VERIFIER versucht und noch keine Freude.

Soweit ich weiß, sollte ich keine benutzerdefinierten Truststores oder Keystores einrichten, da ich bei einem anerkannten Cert-Provider registriert bin.

Ich bin sehr neu mit ssl und finde, dass ich in einem Meer der Akronyme mit drei Buchstaben schwimme, und ich hoffte, dass jemand hier in der Lage sein kann, mir einen Stoß in die richtige Richtung zu geben.

+0

Ich habe herausgefunden, wie man den System Trust Store ausgibt, und ich sehe RapidSSL dort nicht, trotz Posts, die sagen, dass es in Waben war. Ich werde versuchen, meinen eigenen Truststore zu erstellen und zu sehen, was passiert. – mvsjes2

+0

Versuchen Sie Folgendes: https://stackoverflow.com/a/38598593/2301721 (mit HttpsURLConnection) – ashishdhiman2007

Antwort

18

Nach vielen Grabungen und Experimenten wurde mir klar, dass die URL, die ich benutzte, einen hartcodierten Port 80 hatte, anstatt standardmäßig auf 443 zu setzen. Dumm dumm dumm.

Die Antwort auf diese Frage Trusting all certificates using HttpClient over HTTPS half enorm für mein Verständnis von SSL.