[java] PKIX path building failed
https 이미지를 RestTemplate을 통해서 읽어오려고 하니 발생한 에러
www.lesstif.com/system-admin/java-validatorexception-keystore-ssl-tls-import-12451848.html
Java 에서 ValidatorException 등 인증서 관련 에러 해결 - keystore에 SSL/TLS 인증서를 import 하기
-----BEGIN CERTIFICATE----- MIIETTCCAzWgAwIBAgILBAAAAAABRE7wNjEwDQYJKoZIhvcNAQELBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw MDBaFw0yNDAyMjAxMDAwMDBaMEwxCzAJB
www.lesstif.com
해결방법을 검색해보니
1. 모든 인증서를 신뢰하기
2. 필요한 인증서 추가
위와 같은 방법들이 있었고 1번은 지양했다
JAVA PKIX path building failed - 가리사니
``` java javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid ce...
gs.saro.me
문제가 된 곳은 외부연동쪽이다 보니 다양한 CDN 들이 들어와서 발생할때마다 일일히 예외처리할 수 없으니
1번을 하되 이미지를 가져오는 부분에다가 추가 하는 것이 좋다고 생각했다.
RestTemplate 인스턴스 생성할 때 파라메터를 받는 생성자를 하나 더 만들어서 requestFactory를 아래와 같이 return 하도록 추가했다.
public ClientHttpRequestFactory getAllTrustRequestFactory()
throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return requestFactory;
}
PoolingHttpClientConnectionManager를 사용시에는 생성자에 ConnectionSocketFactoryRegistry 파라메터로 입력하여 생성한다
Ignoring SSL certificate in Apache HttpClient 4.3
How to ignore SSL certificate (trust all) for Apache HttpClient 4.3? All the answers that I have found on SO treat previous versions, and the API changed. Related: How to ignore SSL certificate ...
stackoverflow.com
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder
.<ConnectionSocketFactory> create().register("https", sslsf)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(
socketFactoryRegistry);
CloseableHttpClient httpclient = HttpClients.custom()
.setConnectionManager(cm).build();