Как уже предлагалось, вам нужен SSLContext, который игнорирует плохие сертификаты.Точный код, который получает SSLContext по одной из ссылок в вопросе, должен работать, в основном, создав нулевой TrustManager, который не смотрит на сертификаты:
private static TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
public static void main (String[] args) throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new SecureRandom());
HttpClient client = HttpClient.newBuilder()
.sslContext(sslContext)
.build();
Проблема с вышесказанным заключается в том, что сервераутентификация полностью отключена для всех сайтов.Если был только один неверный сертификат, вы могли бы импортировать его в хранилище ключей с помощью:
keytool -importcert -keystore keystorename -storepass pass -alias cert -file certfile
и затем инициализировать SSLContext, используя InputStream, считывающий хранилище ключей следующим образом:
char[] passphrase = ..
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(i, passphrase); // i is an InputStream reading the keystore
KeyManagerFactory kmf = KeyManagerFactory.getInstance("PKIX");
kmf.init(ks, passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
tmf.init(ks);
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
Любой из нихИз вышеперечисленных решений будет работать для самоподписанного сертификата.Третий вариант - в случае, когда сервер предоставляет действительный, не самозаверяющий сертификат, но для хоста, который не соответствует ни одному из имен в сертификате, который он предоставляет, тогда системное свойство "jdk.internal.httpclient.disableHostnameVerification"может быть установлено в "true", и это заставит сертификат быть принятым так же, как API HostnameVerifier использовался ранее.Обратите внимание, что в обычных развертываниях не ожидается, что какой-либо из этих механизмов будет использоваться, так как должна быть возможность автоматической проверки сертификата, предоставленного любым правильно настроенным сервером HTTPS.