IT/Android

[안드로이드] SSL 통신에 대하여... 펌 : http://toriworks.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-SSL-%ED%86%B5%EC%8B%A0%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

데브렉스 2012. 2. 8. 15:50
반응형

펌 : http://toriworks.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-SSL-%ED%86%B5%EC%8B%A0%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

[안드로이드 개발노트] SSL 통신에 대하여...

ANDROID 스터디 / 2010/04/08 18:00

지난 번 글에서 안드로이드 생명주기와 리소스(소켓)에 대한 관계에 대해서 언급을 했었습니다. 이번에는 SSL 소켓 통신에서 주의할 점에 대해서 설명드리고자 합니다.
이 주제는 https가 아닌 일반 소켓 통신에서 SSL 소켓 통신을 말합니다. 만약 https라면 다른 블로그를 찾아보셔야 합니다.

때로는 일반 소켓통신이 아닌 보안소켓을 사용해야 할 경우가 있습니다. 이 경우에 대부분은 JNI를 사용해서 통신을 하는게 일반적인 걸로 보입니다. SSL 소켓을 얻을 때 부터 JNI로 부터 소켓을 얻어서 처리하는 방식입니다. 그렇다면 JNI가 아닌 순수 Java로는 어떻게 SSL 소켓을 구현할까요?

안드로이드에서 기본적으로 java.net 패키지를 지원하는데, 그곳에 SSLSocket이 있습니다. 이걸 이용하면 됩니다. 말씀드리고 싶은건 이 클래스를 이용하는 경우에 반드시 Handshaking이 필요한데, 안드로이드에서 이게 제대로 이뤄지지 않을 수 있습니다. "안드로이드에서 SSL로 Handshaking이 되지 않는다." 가 핵심이죠.


이와 관련해서 제가 받았던 메일을 한번 올려봅니다.
질문)
SSL 통신시에 handshake에 문제가 발생합니다.
 
Java.io.IOException : Wrong version of key store. 라고 나오는데 SSL 소켓 생성시에 안드로이드 쪽에서 해줘야 하는 작업이 혹시 있는지 궁금합니다.

답변)
아래 에러는 말 그대로 key store 가 맞지 않아서 생기는 문제인데요. key store 는 2종류가 있습니다.(제가 파악한 바에 따르면요.)

아마도 소스를 작성하시면서 KeyStore keyStore = KeyStore.getInstance(KeyStore.
getDefaultType()); 로 key store를 얻어오셨을
걸로 생각되는데요.
기본적으로 Java는 JKS 라는 key store를 사용하고 있구요. 안드로이드는 JKS 가 아닌 BKS(Bounce castle Key Store) 를 사용하고 있습니다.
System.out.println(KeyStore.getDefaultType()); 으로 찍어보면 BKS 가 찍히는 걸 보실 수 있습니다. 당연히 JVM(Dalvik)이
JKS를 쓸 줄 알았는데 BKS라는 걸 사용하기 때문에 이 차이로 인해서 Wrong version of key store 라는 오류가 보이는거죠.

SSL Handshaking을 위해서 keytools로 key file을 생성하셨죠? Java에서 나온 keytools 로는 JKS를 사용하는 key file을 생성하신거구요.
BKS 방식의 key file을 따로 만드셔야 합니다.

SSL에서 Handshaking이 되지 않는 이유는 안드로이드가 사용하는 key store가 JKS가 아닌 3rd party인 BKS입니다. 그러다보니 JKS로 된 key store 파일로는 안드로이드에서 사용할 수 없다고 Exception이 나오게 되는겁니다.

그렇다면, 어떻게 BKS key file을 만들 수 있을까요?
JKS로 일단 key file을 만든다음 인터넷에서 JKS 파일을 BKS로 변환해 주는 공짜 툴이 있습니다. 이를 이용해서 BKS로 변경해 주시면 됩니다. 그리고 이후에 raw 폴더에 key file을 넣어두고 쓰시면 됩니다.


다음에는 인터넷에서 http로 바이너리 파일을 읽어서 저장하는 법에 대해서 알아보도록 하겠습니다.
반응형