Android ICS: проблемы с получением сертификата сервера для HttpsUrlConnection - PullRequest
2 голосов
/ 06 декабря 2011

Начиная с Android ICS у нас есть проблемы с проверкой наших сертификатов, которые мы получаем от HttpsUrlConnection.В более ранних версиях Android это работало хорошо.Вот что мы пытаемся сделать:

BrowserCompatHostnameVerifier hostNameVerifier = new BrowserCompatHostnameVerifier();
HttpsURLConnection.setDefaultHostnameVerifier(hostNameVerifier);
URL url = new URL(serverUrl);
this.urlConnection = (HttpsURLConnection) url.openConnection();
this.urlConnection.connect();
hostNameVerifier.verify(urlConnection.getURL().getHost(),
(X509Certificate) urlConnection.getServerCertificates()[0]);

Выдается исключение:

java.lang.IllegalStateException at libcore.net.http.HttpEngine.getCacheResponse (HttpEngine.java:412) в libcore.net.http.HttpsURLConnectionImpl $ HttpUrlConnectionDelegate.getCacheResponse (HttpsURLConnectionImpl.java:390) в libcore.net.http.HttpsURLURNER0NerImpServer_Imp1* Кто-нибудь знает, что могло пойти не так и почему оно сохраняется только после ICS?

Спасибо!

----- Обновление ------- Теперь я сделал свой собственный HostnameVerifierкак это.Я избегаю метода getServerCertificates () - вот так, и он работает:

    public class MyHostNameVerifier implements HostnameVerifier {

    private String expectedHost;

    public MyHostNameVerifier(String expectedHost) {
        this.expectedHost = expectedHost;
    }

    @Override
    public boolean verify(String hostname, SSLSession session) {
        return expectedHost.equals(hostname);
    }
}

1 Ответ

0 голосов
/ 06 декабря 2011

попробуйте проверить ниже ссылки, связанные с вашей проблемой.

http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html

Android: HTTPS (SSL) соединение с использованием HttpsURLConnection

httpclient ssl сертификат на андроид

KeyStore keyStore = ...;
 TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
 tmf.init(keyStore);
 SSLContext context = SSLContext.getInstance("TLS");
 context.init(null, tmf.getTrustManagers(), null);
 URL url = new URL("https://www.example.com/");
 HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
 urlConnection.setSSLSocketFactory(context.getSocketFactory());
 InputStream in = urlConnection.getInputStream();
...