프록시 환경에서 https
로 된 주소의 api를 요청할 때 다음과 같은 에러를 볼 수 있다.
- PKIX path building failed
- unable to find valid certification path to requested target
- java.security.cert.CertificateException: No subject alternative names matching IP address found
http를 요청할 땐 그냥 되던 것이 https로 요청을 하니 뭔가 인증을 해줘야한댄다… 아무튼 뭔가 까다로워졌다.
역시 보안과 네트워크 공부도 해야한다.. 공부는 끝이 없다…
찾아낸 해결방법은 두 가지가 있다.
첫번째로 내 컴퓨터에 인증서를 깔거나 두번째로 ssl인증을 무시하는 방법
1. 내 컴퓨터 인증서를 까는 방법
나의 경우 ${JAVA_HOME}
의 경로가 제대로 안잡히는건지 설치가 제대로 되지 않아 다음과 같이 진행했다.
먼저 환경변수 설정에서 JAVA_HOME의 경로를 찾아 해당 위치를 파일 탐색기에서 열어준다.
그 다음 lib/security
폴더로 이동한다.
해당 폴더에서 주소창에 cmd
를 쳐서 cmd창을 연다.
여기에서 다음을 입력한다.
# 인증서 받기
curl -o root.cer https://letsencrypt.org/certs/isrgrootx1.pem
curl -o ca.cer https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem
굳이 JAVA_HOME의 경로까지 와서 한건...파일탐색기에서 root.cer나 ca.cer가 잘 설치됐나 확인해보시라구?
이것저것 설치를 하고서 해당 위치에 잘 있나 확인한 후에
# keystore에 위에서 받은 인증서를 import 한다
sudo keytool -import -trustcacerts -keystore ./cacerts -alias letsroot -file root.cer -storepass changeit -noprompt
sudo keytool -import -trustcacerts -keystore ./cacerts -alias letsca -file ca.cer -storepass changeit -noprompt
curl -O https://gist.githubusercontent.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93/raw/InstallCert.java
java -cp ./ InstallCert SSL {인증서를 받아올 호스트주소 입력}
서버에서 보내오는 인증서가 두개라면 2를 입력해 enter하고 하나라면 1을 눌러 enter
그러면
Added certificate to keystore ??? using alias 어떤호스트주소
가 나올 것이다.
사실 정확히 어떤 원리인진 모르겠다. 그냥 이렇게 하다보니 됐다..(멋쓱..)
이부분은 나중에 따로 시간이 있을 때 정확하게 공부해야할 것 같다.
2. ssl인증을 무시하는 방법
- 말그대로 인증을 무시하다보니 보안이 취약할 수 있다는 단점이 있겠다.
- 참고
// ssl security Exception 방지
public void disableSslVerification(){
// TODO Auto-generated method stub
try
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType){
}
public void checkServerTrusted(X509Certificate[] certs, String authType){
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session){
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
해당 메소드를 만든 후에
HttpURLConnection이나 RestTemplate 실행 전에 해당 메소드를 실행시키면 된다.
반응형
'Error' 카테고리의 다른 글
vue2 를 Docker 컨테이너에서 개발하기 (0) | 2024.03.28 |
---|---|
glTF-Transform 모듈의 ktx2 압축을 위한 사용 시 에러 (0) | 2022.06.16 |
bpy 모듈 설치하기 (0) | 2022.06.03 |