티스토리 뷰
모바일앱과의 TLS 통신 중에 다음과 같은 오류 발생했습니다.
no cipher suites in common
기존에 사용하던 서버 프로그램이었고, 로컬 컴퓨터에서 잘 동작하였습니다.
안드로이드 단말 중에는 2.3(Gingerbread)이상은 정상적으로 동작하였습니다.
문제는 2.1(eclair), 2.2(froyo) 에서 위에 같은 오류가 발생하고 있습니다.
결론적으로 서버 프로그램에 SSLContext 초기화 시에 키 셋팅이 되지 않아
익명의 암호군(anonymous suite, 사용 가능한 cipher suites 중 키가 anon 임) 을 사용하는데 2.1, 2.2 에서는
사용이 불가능해서 발생하는 오류입니다.
Security Provider가 2.1, 2.2는 Harmony JSSE 이지만 2.3은 AndroidOpenSSL 이어서 그런 것으로 추측합니다.
서버단에 java keytool로 RSA 키를 만들고 설정 후에 해결되었습니다.
익명의 암호군으로 통신이 된다고 해도 중간자 공격에 취약하다는 위험성이 있으므로 키를 설정하고 사용하는 것이 좋을 듯 합니다.
(JSSE 문서 참고)
서버단에 .needClientAuth(true)와 같이 설정한 경우에는 클라이언트에서 키를 생성해야 합니다.
그렇지 않으면 다음과 같은 오류가 납니다.
디버깅을 위해서 서버나 클라이언트 프로그램 실행 시 다음과 같은 옵션을 주어서 SSL 통신 과정을 볼 수 있습니다.
-Djavax.net.debug=all
참고 자료
JavaTM Secure Socket Extension (JSSE) Reference Guide
http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html
http://xrath.com/javase/ko/6/docs/ko/technotes/guides/security/jsse/JSSERefGuide.html
Java ™ Cryptography Architecture (JCA) Reference Guide
http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html
Java and SSL
http://medialab.di.unipi.it/web/doc/JNetSec/jns_ch11.htm
Secure Socket Layer version 3 / Transport Layer Security version 1 (SSLv3 / TLSv1)
http://www.vocal.com/network/ssltls.html
Spongy Castle 라이브러리를 사용하라고 하는데 현재는 왜 사용해야 되는지 모르겠음
http://stackoverflow.com/questions/6898801/how-to-include-the-spongy-castle-jar-in-android
TLS 관련 샘플
Creating a custom key manager for SSL
J2SE 1.4를 사용한 안전한 인터넷 프로그래밍 I
http://blog.daum.net/ohsh69/7716228
cipher suite를 셋팅하라고 하지만 사용할 수 없으면 오류남 (현재 문제에선 도움이 안됨)
http://rgrzywinski.wordpress.com/2004/08/03/dont-forget-to-set-the-cipher-suite/
SSL 통신방법
http://maystyle.tistory.com/457
SSL 통신 구조
SSL handshake with two way authentication with certificates