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
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:732)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:707)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:297)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:286)
at com.htsmgroup.module.test.crawling.HelloEmart.main(HelloEmart.java:17)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
... 15 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 21 more
Process finished with exit code 0
Jsoup.connect(apiURL).get(); 이용해서 데이터 크롤릴중 HTTPS로만 조회가 가능한 경우가 있다.
이런 경우 서버에 인증된 인증서가 아니면 조회를 못하는 오류가 발생한다.
열심히 구글 서치를 통해서 위의 원인은 아래와 같다고 블로글을 접했다.(
- 연결하려는 remote site의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없음
- 서버/클라이언트간 사용하려는 SSL/TLS 버전이 맞지 않음(Ex:TLS 1.0 만 지원하는 서버에 1.2로 hand shaking 요청등)
- SSL/TLS 통신에 사용하려는 cipher suite 가 오래되거나 지원하지 않음. (Ex: JDK 1.8 부터는 RC4 를 사용하려고 하면 에러 발생)
- 웹 브라우저의 경우 인증서 경로 설정을 참고하여 웹 서버에 Intermediate CA certificate 를 설치한다.
나의 경우는 연결하려는 remote site의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없어서 문제가발생한거 같다.
letsencrypt의 경우 인증서가 3개월마다 갱신하는 경우 인증서가 안맞아서 오류가 나는 경우가 있다.
해경방법으로
1. gitHub나 구글에서 InstallCert를 검색해서 다운로드 받는다.
2. 설정된 자바 /Security에 파일을 저장
아래의 명령어 실행
- javac InstallCert.java (파일명 확인-저장시 다르게 하면 다를수 있음)
- java InstallCert [인증서를 다운로드할 도메인 or IP 주소]:[포트]
ex) java InstallCert hasiki.tistory.com
# Example:
java InstallCert tistory.com
Loading KeyStore /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/cacerts...
Opening connection to tistory.com:443...
Starting SSL handshake...
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
<...>
Server sent 1 certificate(s):
1 Subject O=tistory Inc, C=US, ST=Texas, L=Carrollton, CN=*.tistory.com
Issuer CN=SecureTrust CA, O=SecureTrust Corporation, C=US
sha1 4b 46 ca 6b 83 05 b3 51 ff c6 e7 9c fd b3 9b e3 3f 2e c4 53
md5 e8 a5 88 1b d5 67 bb fc 88 cc b1 c5 2b ac c4 7d
Enter certificate to add to trusted keystore or 'q' to quit: [1]
[enter]
[
[
Version: V3
Subject: O=tistory Inc, C=US, ST=Texas, L=Carrollton, CN=*.tistory.com
Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5
<...>
Added certificate to keystore 'jssecacerts' using alias 'tistory.com-1'
keytool -exportcert -alias tistory.com-1 -keystore jssecacerts -storepass changeit -file tistory.com.cer
Certificate stored in file <tistory.com.cer>
(sudo) keytool -importcert -alias tistory.com -keystore /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/cacerts -storepass changeit -file tistory.com.cer
Owner: O=tistory Inc, C=US, ST=Texas, L=Carrollton, CN=*.tistory.com
Issuer: CN=SecureTrust CA, O=SecureTrust Corporation, C=US
<...>
Trust this certificate? [no]:
yes
- 적용할 응용프로그램 재시작
- 잘 적용안되 삽질 ㅜ.ㅜ
- SSL 연결이 필요한 java 명령을 실행할 때, VM 옵션으로 -Djavax.net.ssl.trustStore=인증서경로
위의 옵션으로 적용하니 바로 적용.
'Dev > JAVA' 카테고리의 다른 글
JAVA-String 숫자여부 Check (0) | 2020.07.24 |
---|---|
java-openCSV를 이용해서 CSV 읽기 (0) | 2020.07.24 |
java-Json Return Array or Object구분 (0) | 2020.07.22 |
Request Header 정보 조회 (0) | 2020.07.09 |
JAVA 주소 좌표 구하기 및 거리 측정계산 (0) | 2020.07.01 |