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

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

Solutions Collecting From Web of "Android HttpClient – имя хоста в сертификате не соответствует <example.com>! = <*. Example.com>"

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

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) был частью сертификата, в противном случае исходное исключение было бы сброшено. Это означает, что действительно недействительные сертификаты все равно будут терпеть неудачу.

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

Вы можете написать свой собственный X509TrustManager, чтобы проверить наличие шаблона.

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

Самоподписанный SSL-прием на Android

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

Если вы используете только вызов WebView

 webview.clearSslPreferences(); 

Игнорировать ошибки SSL