Java2012. 10. 16. 16:59

https로 데이터를 요구할 경우에 인증서가 만료되었거나 없을 경우 다음과 같은 Exception이 발생하게 된다.


Caused by: 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


이때 인증서를 다운 받거나 아니면 인증서를 무시하는 코드를 작성하면 문제는 해결이 된다.


인증서를 무시하는 방법에 대해서 알아보겠다.


TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs,
                String authType) {
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs,
                String authType) {
        }
    } };

    //Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc
                .getSocketFactory());
        HttpsURLConnection
                .setDefaultHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String paramString,
                            SSLSession paramSSLSession) {
                        return true;
                    }
                });
    } catch (Exception e) {
    }

    InputStreamReader isr = null;
    //Now you can access an https URL without having the certificate in the truststore
    try {
        URL url = new URL(
                "https://requestUrl");
        HttpsURLConnection con = (HttpsURLConnection) url
                .openConnection();
        isr = new InputStreamReader(con.getInputStream(), "utf-8");

        int c;
        while ((c = isr.read()) != -1) {
            sb.append((char) c);
        }

        //System.out.println(sb.toString());

    } catch (MalformedURLException e) {
        out.println(e.toString());
    } finally {
        try {
            isr.close();
        } catch (Exception e) {

        }
    }


다음의 코드로 데이터를 받으면 문제 없이 받을 수 있다.


참 쉽다.

'Java' 카테고리의 다른 글

java.lang.NoSuchMethodError..  (0) 2013.08.27
Java Server Timeout Test하기.  (0) 2013.02.05
EhCache의 Spring Framework(iBatis)적용...!  (0) 2012.09.18
json-lib-2.4-jdk15.jar  (0) 2012.08.24
Log4j의 Appender..!  (0) 2012.06.26
Posted by Z700zZz