Исключение SSLE, когда серверный сертификат использует SAN (альтернативное имя субъекта) - PullRequest
2 голосов
/ 18 августа 2010

Я пытаюсь установить соединение https с помощью классов в org.apache.http. *. В качестве части моей настройки я использую класс BrowserCompatHostnameVerifier (), который гласит:

Имя хоста должно совпадать либо с первым CN, либо с любым из альтернативных объектов. Подстановочный знак может встречаться в CN и в любом из альтернативных объектов.

Когда я попадаю на сервер, имя хоста которого не совпадает с указанным в CN, но совпадает с одной из записей в субъектах, я получаю следующее исключение:

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

Сравните это поведение и то, что при замене URL-адреса на "https://www.google.com". я могу обойти это, создав собственный X509HostnameVerifier, но я хочу знать, является ли это допустимой ошибкой в ​​BrowserCompatHostnameVerifier или я делать что-то не так.

У кого-нибудь еще есть подобные проблемы?

1 Ответ

1 голос
/ 18 августа 2010

В соответствии с транком AbstractVerifier.java , он не поднимает ваш subjectAltName (в нем перечислены все имена, найденные в исключении). openssl s_client -connect mtvniph1-f.akamaihd.net:443 -showcerts предполагает, что это не проблема с сертификатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...