Как вы правильно заметили, есть две проблемы: а) сертификат не является доверенным, и б) имя сертификата не соответствует имени хоста.
ПРЕДУПРЕЖДЕНИЕ: для всех, кто придет к этому ответу, это грязный, ужасный хак, и вы не должны использовать его для всего, что имеет значение.SSL / TLS без аутентификации хуже, чем вообще без шифрования - чтение и изменение ваших «зашифрованных» данных для злоумышленника тривиально , и вы даже не узнаете, что это происходило .
Все еще со мной?Я боялся, что ...
а) решается путем создания настраиваемого SSLContext, которому TrustManager принимает все:
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
}
}, null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory());
и б) путем создания HostnameVerifier, позволяющего установить соединение, даже еслисертификат не соответствует имени хоста:
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
Оба должны произойти в самом начале вашего кода, прежде чем вы начнете возиться с HttpsURLConnections и так далее.Это работает как в Android, так и в обычной JRE.Наслаждайтесь.