이 문제는 기본 JVM 신뢰할 수있는 호스트의 일부가 아닌 인증서 공급자에게 쫓겨났습니다 JDK 8u74
. 공급자는 www.identrust.com 이지만 연결하려는 도메인이 아닙니다. 해당 도메인은이 공급자로부터 인증서를 받았습니다. JDK / JRE의 기본 목록으로 교차 루트 커버 신뢰를 참조 합니까?를 참조하십시오. -몇 가지 항목을 읽습니다. Let 's Encrypt를 지원하는 브라우저 및 운영 체제 도 참조하십시오 .
그래서 내가 관심있는 도메인에 연결하기 위해 인증서를 발급받은 identrust.com
다음 단계를 수행했습니다. 기본적으로 DST Root CA X3
JVM 에서 identrust.com ( ) 인증서를 신뢰해야했습니다. Apache HttpComponents 4.5를 사용하여 그렇게 할 수있었습니다.
1 : Certificate Chain Download Instructions (인증서 체인 다운로드 지침) 에서 불 신탁으로부터 인증서를 얻습니다 . 온 클릭 DST 루트 CA X3의 링크.
2 : 문자열을 "DST Root CA X3.pem"파일에 저장하십시오. 시작과 끝에 파일에 "----- BEGIN CERTIFICATE -----"및 "----- END CERTIFICATE -----"행을 추가해야합니다.
3 : 다음 명령으로 java 키 저장소 파일 cacerts.jks를 작성하십시오.
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4 : 결과 cacerts.jks 키 저장소를 java / (maven) 애플리케이션의 resources 디렉토리에 복사하십시오.
5 : 다음 코드를 사용하여이 파일을로드하고 Apache 4.5 HttpClient에 첨부하십시오. 이렇게하면 indetrust.com
util oracle 에서 발급 한 인증서가있는 모든 도메인의 문제 가 JRE 기본 키 저장소에 인증서를 포함합니다.
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
프로젝트가 빌드되면 cacerts.jks가 클래스 경로에 복사되어로드됩니다. 이 시점에서 다른 ssl 사이트에 대해 테스트하지는 않았지만이 인증서의 위의 코드 "체인"도 작동하지만 다시는 모릅니다.
참조 : 사용자 정의 SSL 컨텍스트 및 Java HttpsURLConnection으로 자체 서명 된 인증서를 수락하는 방법은 무엇입니까?