Я довольно новичок в Java-Spring мире, и я не могу справиться с моей ситуацией. Мне нужно работать с некоторыми API через HTTPS, которые имеют сертификаты, выданные не доверенным ЦС. У меня есть код для этого:Java-Spring: как отключить проверку сертификата для конкретного HTTP-запроса?
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json;charset=UTF-8");
headers.add("Accept", "*/*");
ResponseEntity<byte[]> responseEntity = restTemplate.getForEntity(url, byte[].class, headers);
Конечно, потому что сертификаты не является доверенным, я использовал, чтобы получить Java ошибка:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Поэтому я отключил проверку сертификата с кодом:
public class SSLCertificateValidation {
public static void disable() {
try {
SSLContext sslc = SSLContext.getInstance("TLS");
TrustManager[] trustManagerArray = { new NullX509TrustManager() };
sslc.init(null, trustManagerArray, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
}
catch(Exception e) {
e.printStackTrace();
}
}
private static class NullX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
System.out.println();
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
System.out.println();
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
private static class NullHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}
Теперь мое приложение работает с этими API, но, с другой стороны, я работаю с некоторыми услугами AWS из этого приложения. И теперь я получаю ошибку AWS:
c.a.h.AmazonHttpClient - Unable to execute HTTP request: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
Есть ли способ отключить проверку сертификата только для определенных URL-адресов? Может, кто-нибудь протянет мне руку помощи, пожалуйста? Я действительно не знаю, что мне теперь делать.
PS Я знаю об установке сертификата в java cacerts. Но, к сожалению, это не подходит для моей ситуации.
Я знаю об установке сертификата на ява cacerts. Но, к сожалению, это не хорошо для моей ситуации. Я ищу ответ на вопрос, который я задал. – user3742622