HttpClient Android - sertifikada ana makine adı <example.com> eşleşmedi = <* example.com.>!

oy
17

Ben bağlanmak için Android'de HttpClient kullanıyorum https://someUrl.com/somePath . Sorun bu yüzden bir SSLException olsun, sitenin sertifikasının * .someUrl.com değil someUrl.com için olmasıdır. Onu düzelttirmek sürece sitenin parçası Lame, evet, ama, takıldım. Ben sertifikayı dinlenmek ve kabul HttpClient alabilirsiniz bir yolu var mı?

Oluştur 28/06/2010 saat 20:52
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
33

Bu benim (düzenlenmiş) bir çözümdür:

class MyVerifier extends AbstractVerifier {

    private final X509HostnameVerifier delegate;

    public MyVerifier(final X509HostnameVerifier delegate) {
        this.delegate = delegate;
    }

    @Override
    public void verify(String host, String[] cns, String[] subjectAlts)
                throws SSLException {
        boolean ok = false;
        try {
            delegate.verify(host, cns, subjectAlts);
        } catch (SSLException e) {
            for (String cn : cns) {
                if (cn.startsWith("*.")) {
                    try {
                          delegate.verify(host, new String[] { 
                                cn.substring(2) }, subjectAlts);
                          ok = true;
                    } catch (Exception e1) { }
                }
            }
            if(!ok) throw e;
        }
    }
}


public DefaultHttpClient getTolerantClient() {
    DefaultHttpClient client = new DefaultHttpClient();
    SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client
            .getConnectionManager().getSchemeRegistry().getScheme("https")
            .getSocketFactory();
    final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();
    if(!(delegate instanceof MyVerifier)) {
        sslSocketFactory.setHostnameVerifier(new MyVerifier(delegate));
    }
    return client;
}

Bu bir joker alanı olmadığı sürece varsayılan davranışı değiştirme değil avantajına sahiptir ve bu durumda o 2 yarı etki sanki yeniden doğrular (örneğin someUrl.com) aksi orijinal istisna rethrown edilir sertifikanın parçasıydı. Yani gerçekten geçersiz certs hala başarısız olacağı anlamına gelir.

Cevap 29/06/2010 saat 00:55
kaynak kullanıcı

oy
3

Android'de BouncyCastle çok eski olduğunu ve genel sertifika tanımıyor.

Sen joker denetlemek için kendi X509TrustManager yazabilirsiniz.

Bu riski kabul eğer yoksa tamamen sertifikası kontrolünü devre dışı bırakabilir. Bu soruya bakın,

Android'de Kendinden imzalı SSL kabul

Cevap 28/06/2010 saat 22:34
kaynak kullanıcı

oy
1

Eğer bir WebView'ı kullanırsanız sadece çağrı

webview.clearSslPreferences();

SSL hataları görmezden

Cevap 07/10/2011 saat 16:17
kaynak kullanıcı

oy
1

O isterse *.someUrl.comsadece bunu verebilir gibi, o görünüyor www.someUrl.com/somePathyerine someUrl.com/somePath.

Cevap 28/06/2010 saat 20:59
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more