2010-08-17 2 views
2

J'essaie d'établir une connexion https en utilisant les classes de org.apache.http. *. Dans le cadre de ma configuration, j'utilise la classe BrowserCompatHostnameVerifier() qui stipule:SSLException lorsque le certificat du serveur utilise SAN (Subject Alternative Name)

The hostname must match either the first CN, or any of the subject-alts. A wildcard can occur in the CN, and in any of the subject-alts.

Quand je frappe un serveur qui est le nom d'hôte ne correspond pas à ce qui est spécifié dans le CN, mais ne correspond une des entrées dans le sujet-alts, je reçois l'exception suivante:

javax.net.ssl.SSLException: hostname in certificate didn't match: <mtvniph1-f.akamaihd.net> != <a248.e.akamai.net> 
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:222) 
    at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54) 
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:151) 
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:132) 
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:321) 

Voici le bloc de code pertinent qui est à l'origine de cette erreur:

DefaultHttpClient seed = new DefaultHttpClient(); 
SchemeRegistry registry = new SchemeRegistry(); 

SSLSocketFactory ssf = SSLSocketFactory.getSocketFactory(); 

// XXX: This verifier isn't working with Subject Alternative Names 
ssf.setHostnameVerifier(new BrowserCompatHostnameVerifier()); 

registry.register(new Scheme("https", ssf, 443)); 

SingleClientConnManager mgr = new SingleClientConnManager(seed.getParams(), registry); 
DefaultHttpClient http = new DefaultHttpClient(mgr, seed.getParams()); 

// Config point, change to your preference 
String url = "https://mtvniph1-f.akamaihd.net/e3_ubisoft_prod0.m3u8"; 

HttpGet method = new HttpGet(url); 

HttpResponse response = null; 
try 
{ 
    response = http.execute(method); 
} 
catch (Exception e) 
{ 
    Log.e(TAG, "Request failed", e); 
} 

Comparer ce comportement et que whe n vous remplacez l'URL par "https://www.google.com". Je peux contourner cela en créant mon propre X509HostnameVerifier, mais je veux savoir si c'est un bug valide dans BrowserCompatHostnameVerifier ou si je fais quelque chose de mal.

Quelqu'un d'autre ayant des problèmes similaires?

+0

Mise à jour: J'ai essayé le même bloc de code en utilisant Apache HttpComponents (http://hc.apache.org) v4.0.1 lib directement et je ne peux pas reproduire le comportement. Cela m'amène à croire que c'est un bug dans l'implémentation Android de cette librairie. –

+0

Il existe deux de ces bugs, http://code.google.com/p/android/issues/detail?id=17680&can=1&q=reporter%3Anathan%2Cjanrain.com&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars et un autre je ne peux pas trouver un lien qui lit seulement les premiers 16 (8?) noms dans l'extension SAN. – nmr

Répondre

1

Selon la ligne de réseau AbstractVerifier.java, il ne prend pas votre subjectAltName (il répertorie tous les noms qu'il trouve dans l'exception). openssl s_client -connect mtvniph1-f.akamaihd.net:443 -showcerts suggère que ce n'est pas un problème avec le certificat.