Android HttpClient-Nazwa hosta w certyfikacie nie pasowała!= < * . example.com>

Używam HttpClient na Androidzie, aby połączyć się z https://someUrl.com/somePath . problem polega na tym, że certyfikat strony jest dla *.someUrl.com, nie someUrl.com, więc dostaję SSLException. Kiepsko ze strony, tak, ale jeśli nie uda mi się go naprawić, utknąłem. Czy istnieje sposób, w jaki mogę uzyskać HttpClient, aby się zrelaksować i zaakceptować certyfikat?

Author: Tim Gilbert, 2010-06-28

4 answers

To jest moje (edytowane) rozwiązanie:

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

Ma tę zaletę, że nie zmienia domyślnego zachowania, chyba że istnieje domena wieloznaczna, a w takim przypadku rewaliduje się tak, jakby domena dwuczęściowa (np. someUrl.com) były częścią certyfikatu, w przeciwnym razie pierwotny wyjątek jest retrospektywny. Oznacza to, że naprawdę nieważne Cert nadal zawiedzie.

 33
Author: noah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 13:39:57

BouncyCastle na Androidzie jest za stary i nie rozpoznaje certyfikatu wildcard.

Możesz napisać własny menedżer X509TrustManager, aby sprawdzić, czy nie ma symboli wieloznacznych.

LUB możesz całkowicie wyłączyć sprawdzanie certyfikatu, jeśli akceptujesz ryzyko. Zobacz to pytanie,

Akceptacja SSL z własnym podpisem na Androidzie

 3
Author: ZZ Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:34

Jeśli chce *.someUrl.com, to wydaje się, że możesz po prostu dać www.someUrl.com/somePath zamiast someUrl.com/somePath.

 1
Author: Melody Horn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 19:59:17

Jeśli używasz WebView wystarczy zadzwonić

webview.clearSslPreferences();

Aby zignorować błędy SSL

 1
Author: Ayreon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-07 15:17:09