Android HttpClient - имя хоста в сертификате не соответствовало <example.com>! = <*.example.com>

Я использую HttpClient на Android для соединения с https://someUrl.com/somePath. Проблема состоит в том, что сертификат сайта для *.someUrl.com, не someUrl.com, таким образом, я получаю SSLException. Ламе со стороны сайта, да, но если я не могу получить зафиксированный, я застреваю. Существует ли способ, которым я могу заставить HttpClient ослаблять и принимать сертификат?

18
задан Tim Gilbert 20 March 2012 в 06:42
поделиться

3 ответа

Это мое (отредактированное) решение:

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

Оно имеет то преимущество, что не меняет поведение по умолчанию, если нет домена с подстановочными знаками, и в этом случае оно повторно проверяется, как если бы домен из двух частей (например, someUrl.com) были частью сертификата, в противном случае исходное исключение генерируется повторно. Это означает, что действительно недействительные сертификаты все равно не работают.

33
ответ дан 30 November 2019 в 07:17
поделиться

BouncyCastle на Android слишком старый и не распознает групповой сертификат.

Вы можете написать свой собственный X509TrustManager для проверки подстановочного знака.

или вы можете вообще отключить проверку сертификатов, если согласны с риском. См. Этот вопрос:

Самоподписанное принятие SSL на Android

3
ответ дан 30 November 2019 в 07:17
поделиться

Если он хочет *. SomeUrl.com , то, похоже, вы могли бы просто дать ему www.someUrl.com/somePath вместо someUrl.com/somePath .

1
ответ дан 30 November 2019 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: