JSOUP을 이용하다가 https://
으로 시작하는 URL에 대해 connect
메소드를 호출하면, javax.net.ssl.SSLHandshakeException
에러가 송출된다.
해결 방법은 2가지가 있다.
아래와 같은 setSSL
메소드를 만들어주고 실행하는 것이다.
public static void setSSL() throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
위의 setSSL()
메소드는 SSL 인증서의 유효성 체크를 진행하지 않고, 유효성 체크를 비활성화 하는 방식으로 SSL
에 접근하는 것이다.
또 다른 방법으로는 서버 인증서를 자바 KeyStore에 저장하는 방법이 있는데,
Portecle GUI
등의 툴을 이용하여 해당 사이트의 인증서를 다운로드할 수 있다.
다운받은 뒤에는 $JAVA_HOME/lib/security/cacerts
파일을 열어서 인증서를 추가해주면 된다.
열람 시에 기본 암호는 changeit으로 설정되어 있다.
감사합니다 덕분에 https SSL 인증서 적용한 배포 서버에도 크롤링 데이터 잘 가져올 수 있었습니다 :)