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

Android 服务器证书使用SAN时的SSLException(主题替代名称),android,ssl,Android,Ssl,我正在尝试使用org.apache.http.*中的类建立https连接。作为设置的一部分,我使用BrowserCompatHostnameVerifier()类,该类声明: 主机名必须与第一个CN或任何主题ALT匹配。通配符可以出现在CN和任何主题ALT中 当我点击的服务器的主机名与CN中指定的主机名不匹配,但与主题alts中的一个条目匹配时,我得到以下异常: javax.net.ssl.SSLException: hostname in certificate didn't match: &

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

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

当我点击的服务器的主机名与CN中指定的主机名不匹配,但与主题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)
将此行为与将url替换为“”时的行为进行比较。我可以通过创建自己的X509HostnameVerifier来解决这个问题,但我想知道这是BrowserCompatHostnameVerifier中的一个有效错误,还是我做错了什么


还有其他人有类似的问题吗?

根据trunk的说法,它没有拾取您的subjectAltName(它列出了在异常中找到的所有名称)<代码>openssl s_客户端-连接MTVNIF1-f.akamaihd.net:443-showcerts表明证书没有问题。

更新:我直接使用ApacheHttpComponents()v4.0.1库尝试了相同的代码块,无法重现该行为。这让我相信这是这个库的Android实现中的一个bug。有两个这样的bug,另一个我找不到链接,只能读取SAN扩展中的前16个(8?)名称。
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);
}