본문 바로가기

Java/Java Core

[JAVA] HttpURLConnection https 호출 시 ssl 인증서 오류(java.security.cert.CertificateException: No subject alternative names matching IP address found)

HttpURLConnection를 사용해 http 주소를 불러 오다가 https로 교체되었다. 주소만 바꿔줬더니 "javax.net.ssl.SSLHandshakeException:javax.net.ssl.SSLHandshakeException: No subject alternative names matching IP address found" 에러 발생

 

결론부터 말하면 https 사용에 따른 ssl 인증 오류이다. 이를 해결하기 위해 여러 방법이 있지만 SSL 인증을 우회하는 방법을 사용했다.

 

우선 HttpURLConnection을 알아보자

URLConnection, HttpURLConnection, HttpsURLConnection 차이

URLConnection
: 기본 클래스입니다. 추상 클래스이므로 해당 유형의 객체를 인스턴스화 할 수 없습니다.

HttpURLConnection : 추가 API가 필요하고 HTTP 또는 HTTPS 만 처리 할 때 사용할 수있는 URLConnection 파생 클래스입니다. HTTP URL과 관련된 필드 및 메서드 (예 : HTTP_CLIENT_TIMEOUT 또는 setRequestMethod)를 제공합니다.

HttpsURLConnection : '더 많은 추가'API가 필요하고 HTTPS 만 처리 할 때 사용할 수있는 '파생 클래스'입니다.

세 개 모두 추상이며 사용자가 모르는 특정 클래스로 구현됩니다.


원본 출처 : https://stackoverrun.com/ko/q/910457

 

 

HttpURLConnection을 이용해서 Connect시 SSL인증 무시하는 법


disableSslVerification 메소드를 connectioin 전에 실행해주면된다.

	// 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();
	    }
	}

원본 출처 : m.blog.naver.com/PostView.nhn?blogId=writer0713&logNo=220519733818&proxyReferer=https:%2F%2Fwww.google.com%2F