服务器证书使用SAN时的SSLException(主题备用名称)

时间:2010-08-17 22:37:09

标签: android ssl

我正在尝试使用org.apache.http。*中的类建立https连接。作为我的设置的一部分,我正在使用BrowserCompatHostnameVerifier()类,该类声明:

  

主机名必须与第一个CN或任何主题相匹配。通配符可以出现在CN和任何主题中。

当我点击服务器的主机名与CN中指定的主机名不匹配,但确实匹配了subject-alts中的一个条目时,我得到以下异常:

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)

以下是导致此错误的相关代码块:

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

比较此行为以及用“https://www.google.com”替换网址时的行为。我可以通过创建自己的X509HostnameVerifier来解决这个问题,但我想知道这是否是BrowserCompatHostnameVerifier中的有效错误,或者我是否做错了。

其他人有类似问题吗?

1 个答案:

答案 0 :(得分:1)

根据trunk AbstractVerifier.java,它没有获取你的subjectAltName(它列出了它在异常中找到的所有名称)。 openssl s_client -connect mtvniph1-f.akamaihd.net:443 -showcerts表明证书不是问题。