Android

android 웹서비스 url 요청시 ssl 인증서(https) 에러 문제

박진만 2012. 11. 14. 13:46
반응형

서버에 ssl 보안 인증을 설치한 후 https:// 로 android 에서 웹서비스 url 요청시 응답이 오지 않는 문제

원인은 응답이 오기전에 인증서 에러 페이지가 로드되면서 에러 발생

해당 소스 추가해서 해결

앱 실행시 onCreate 부분에

postHttps(String url, int connTimeout, int readTimeout);

메소드를 선언해 주면 문제없이 응답이 온다.

아래 소스는 해당 메소드를 가지고 있는 클래스 소스

package util;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

//웹서비스 요청시 SSL 인증서 에러 방지
public class SslConnect {

 // always verify the host - dont check for certificate
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                    return true;
            }
    };
 
    /**
     * Trust every server - don't check for any certificate
     */
    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }
 
            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }
 
            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }
        }};
 
        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static HttpsURLConnection postHttps(String url, int connTimeout, int readTimeout) {
        trustAllHosts();
 
        HttpsURLConnection https = null;
        try {
            https = (HttpsURLConnection) new URL(url).openConnection();
            https.setHostnameVerifier(DO_NOT_VERIFY);
            https.setConnectTimeout(connTimeout);
            https.setReadTimeout(readTimeout);
        } 
        catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        } 
        catch (IOException e) {
            e.printStackTrace();
            return null;
        }
 
        return https;
    }
}
반응형