ERROR_IO_EXCEPTION:java.security.cert.CertPathValidatorException
내 컴을 서버로 잡고 MAMP Pro(14일 트라이얼)를 이용해서 SSL을 만들고 .
HTTPS 연결해서 안드로이드 어플에서 접속하려하는데 에러가 발생했다.
ERROR_IO_EXCEPTION:java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
음.. 근본부터 따져보자면,
HTTPS는 공개키 암호화 방식을 사용하는 프로토콜이다. 얼마나 암호화 되며 안전한가의 여부는 웹브라우저의 구현정도와 서버의 소프트웨어, 그리고 지원하는 암호화 알고리즘에 따라 달려있다.
HTTPS를 만들려면 서버인증서와 CA인증서가 필요하다.
서버인증서는 자체제작을 하는것이고, CA인증서는 별도로 등록된 기관에서 발급해주는것이다.
신뢰할수있는 기관에서 발행해주는 제대로된 CA인증서는 연간 수십만원의 비용이 든다.
그리고, 클라이언트. 즉 웹브라우저는 SSL 연결을 열고 서버 인증서를 받으면 그 서버 인증서가 어떤 CA 인증서로 서명되었는지 확인하고 그 CA가 자신의 신뢰할 수 있는 인증 기관 목록에 들어있는지 확인한다.
(출처 : http://www.misari.codns.com/bbs/board.php?bo_table=linux&wr_id=9148)
====================================================================
다시 본론으로 돌아와서,
ERROR_IO_EXCEPTION:java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
해당에러는 서버측이 가지고 있는 인증서가 자체서명된 루트인증서이며, 타사에 의해 검증되지 않았기 때문에 보안인증서에 문제가 있다고 해서 뜨는것이다. (웹브라우저 크롬에서 HTTPS로 된 URL에 접속해보면 HTTPS에 빨간줄 그어져 있고 클릭해보면 방금 쓴 내용이 나온다.)
우선은 개발을 하는데 HTTPS를 테스트해보려고 하는건데, 돈내고 CA 인증서를 받기는 좀 뭐하다.
해결방법
1. 안드로이드에서는 HttpsURLConnection 과 SSLSocket으로 연결할때의 해결방법을 제시해줬다. (http://developer.android.com/training/articles/security-ssl.html)
2. 자체서명한 인증서 생성하기(우분투. 레드햇) . 아예 본인컴에서 서버인증서를 만들고, 그 인증서를 본인이 서명하자.
(http://www.fis.unipr.it/pub/linux/redhat/9/en/doc/RH-DOCS/rhl-cg-ko-9/s1-secureserver-selfsigned.html)
(http://kjunine.tistory.com/6)
(http://knight76.tistory.com/1568)
3. 이거는 좀 다르다. HTTPS hostname wrong오류 안나게 하는것. 이방법 적용해도 CertPathValidatorException은 발생한다.
서버인증서를 검증 무시(HTTPS hostname wrong오류 안나게)(http://blue_0227.blog.me/130131233956)
4. HttpsURLConnection를 이용해서 접속할때 인증과정을 없앰.
인증 과정을 결정하는 부분은 SSLContext.init() 함수이다.
아래 소스에는 init() 함수에 모두 null 을 집어 넣음으로써 인증 과정을 무시하고 서버의 내용물을 받는다.
아래 소스에는 init() 함수에 모두 null 을 집어 넣음으로써 인증 과정을 무시하고 서버의 내용물을 받는다.
(http://pcycom.tistory.com/662)
-> 하지만 그래도 CertPathValidatorException은 발생한다.