web-dev-qa-db-ja.com

Android HttpClient-証明書のホスト名が<example.com>と一致しませんでした!= <*。example.com>

Androidに接続するためにHttpClientを使用しています https://someUrl.com/somePath 。問題は、サイトの証明書が* .someUrl.com用であるということです。 、someUrl.comではないので、SSLExceptionが発生します。サイトの一部で問題が発生します。はい、しかし、修正できない限り、行き詰まります。HttpClientにリラックスして証明書を受け入れる方法はありますか?

18
noah

これは私の(編集された)解決策です:

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

ワイルドカードドメインがない限り、デフォルトの動作を変更しないという利点があります。その場合、2つの部分のドメイン(someUrl.comなど)が証明書の一部であるかのように再検証されます。そうでない場合、元の例外が再スローされます。つまり、本当に無効な証明書は引き続き失敗します。

33
noah

AndroidのBouncyCastleは古すぎて、ワイルドカード証明書を認識しません。

独自のX509TrustManagerを記述して、ワイルドカードをチェックできます。

または、リスクを受け入れることができる場合は、証明書チェックを完全に無効にすることができます。この質問を参照してください、

Androidでの自己署名SSL受け入れ

3
ZZ Coder

webViewを使用する場合は、

webview.clearSslPreferences();

sSLエラーを無視する

1
Ayreon

必要な場合は*.someUrl.com、それならあなたはそれを与えることができるようですwww.someUrl.com/somePath の代わりに someUrl.com/somePath

1
Melody Horn