2011-12-06 2 views
2

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

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 в libcore.net.http.HttpEngine.getCacheResponse (HttpEngine.java : 412) в libcore.net.http.HttpsURLConnectionImpl $ HttpUrlConnectionDelegate.getCacheResponse (HttpsURLConnectionImpl.java:390) в libcore.net.http.HttpsURLConnectionImpl.getServerCertificates (HttpsURLConnectionImpl.java:87)

Знает ли кто-нибудь, что могло пойти не так, и почему оно сохраняется только после 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); 
    } 
} 

ответ

0

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

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

Android: HTTPS (SSL) connection using HttpsURLConnection

httpclient ssl certificate on android

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(); 
+0

Ссылки не помогают мне. Моя проблема связана только с Android 4. На 2 и 3 они работают. – zubke

+0

Я думаю, что они внесли некоторые изменения в ICS. Посмотрите на ссылку http://android-developers.blogspot.com/2011/09/androids-http-clients.html – Maneesh

+0

@zubke. Не могли бы вы указать, какое решение для ты был? –