안드로이드에서 SSL 통신시 클라이언트 인증서 사용하는법을 찾아서
일주일동안 고생했다.
인터넷에 하두 많은 자료들이 있지만, 내 경우에는 잘 안되더라.
겨우겨우 찾아낸 방법. 휴~ 힘들다.

* 인증서 : comodo 에서 결제해서 받았음.
_wildcard_도메인.pfx 파일을 확장자를 .p12로 바꿔서 안드로이드의 raw 폴더에 넣는다.
이 인증서의 비밀번호 알고 있어야 한다.

* 안드로이드 소스. SSLContext 생성하는 함수
private SSLContext doGetSSLContext()
{
    SSLContext sslContext = null;
    InputStream caInput = this.context.getResources().openRawResource(R.raw._wildcard_storyand_com);

    try
    {
      // 클라이언트 인증서를 로드한다.
      KeyStore keyStore = KeyStore.getInstance("PKCS12");
      keyStore.load(caInput, "인증서비밀번호".toCharArray());

      // 클라이언트 인증서를 이용해서 KeyManager를 만든다.
      String kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
      KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmfAlgorithm);
      kmf.init(keyStore, null);

      // 클라이언트 인증서를 이용해서 TrustManager를 만든다.
      String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
      tmf.init(keyStore);

      // TrustManager 와 KeyManager를 이용해서 SSLContext 를 생성한다.
      sslContext = SSLContext.getInstance("TLS");
      sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    }
    catch(Exception exp)
    {
      lib_common.doLog("*** lib_http... doGetSSLContext..." + exp.toString());
      sslContext = null;
    }

    return sslContext;
}


* 안드로이드 소스. SSLContext 사용하는법
// 서버 연결
URL url = new URL(this.sURL);
HttpURLConnection conn = null;

// http 일대
if(this.sURL.startsWith("http://"))
{
    conn = (HttpURLConnection)url.openConnection();
}

// https 일대
if(this.sURL.startsWith("https://"))
{
    // SSLContext 생성
    SSLContext sslContext = doGetSSLContext();
    conn = (HttpsURLConnection)url.openConnection();
    ((HttpsURLConnection)conn).setSSLSocketFactory(sslContext.getSocketFactory());
}
... 이후는 일반적인 통신 방법과 동일함.






반응형
Posted by 돌비
,