web-dev-qa-db-fra.com

Android ssl: javax.net.ssl.SSLPeerUnverifiedException: pas de certificat d'homologue (encore une fois)

J'ai un site Web sur lequel j'active SSL pour un service RESTful. Nous nous sommes inscrits auprès de RapidSSL, avons installé les certificats et il passe le vérificateur RapidSSL . Je suis en mesure d'accéder au site avec différents navigateurs, y compris les Android (intégrés, firefox et opera) sans aucun problème, sans avertissement.

Cependant, lorsque j'essaie d'y accéder avec mon Android, j'obtiens l'exception suivante:

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)

Cela se produit sur Android 2.3.3 sur l'émulateur et sur une tablette 3.2. J'ai vu beaucoup de succès à ce sujet, mais rien de ce que j'ai trouvé ne m'aide à résoudre le problème.

Plus de données:

$ 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]

Le code que j'exécute pour configurer le client:

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]

J'ai également essayé avec STRICT_HOSTNAME_VERIFIER et toujours pas de joie.

D'après ce que je comprends, je ne devrais pas avoir besoin de configurer des magasins de clés de confiance ou des magasins de clés personnalisés car je suis inscrit auprès d'un fournisseur de certificats reconnu.

Je suis très nouveau avec ssl et je trouve que je nage dans une mer d'acronymes à trois lettres, et j'espérais que quelqu'un ici pourrait me donner un coup de pouce dans la bonne direction.

25
mvsjes2

Après des tas de fouilles et d'expérimentation, j'ai finalement réalisé que l'url que j'utilisais avait un port codé en dur 80 au lieu de passer par défaut à 443. Dumb dumb dumb.

La réponse à cette question Faire confiance à tous les certificats en utilisant HttpClient sur HTTPS m'a énormément aidé pour ma compréhension de SSL.

18
mvsjes2