OpenJDK로 https 접근 시 the trustAnchors parameter must be non-empty 예외 발생

기본

새해가 밝아오면서 전사적으로 SNS를 이용한 컨텐츠 공유에 힘쓰려나 봅니다. 그래서 트위터, 페이스북의 Open API를 둘러보다가 트위터 타임라인을 가져오는 간단한 예제 프로그램을 만들어 보려고 마음 먹었습니다.

트위터에서 소개된 OAuth 라이브러리 중 제일 간단해 보이는 Scribe를 선택했지요. 트위터에 요청하는 REST API는 다음과 같습니다:

https://api.twitter.com/1/statuses/home_timeline.json

물론 헤더에 OAuth 관련 파라미터들도 잔뜩 붙지요. 얼마 전에 졸업 프로젝트로 구글 캘린더 연동도 해봤던 터라 별 문제 없을 줄 알았는데 생전 처음보는 예외를 접했습니다.

javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected
error: java.security.InvalidAlgorithmParameterException: the
trustAnchors parameter must be non-empty

읭? 이건 무슨 에러인고. 구글링을 해보니 Truststore라는 인증서들을 보관하는 파일(JRE/lib/security/cacerts)이 있는데, 요 안에 해당 https 요청을 할 때 사용할 인증서가 들어있지 않거나 혹은 이 인증서가 유효하지 않아서 나는 에러메시지 같았습니다. 이 에러는 특히 OpenJDK를 사용할 때 발생하며 Sun, Oracle, Apple의 JDK를 사용하면 발생하지 않습니다.

첫 월급으로 맥북 에어를 지른 터라 맥을 사용하고 있는데요. 최근에 JDK 1.7 사용해 보려고 OpenJDK 1.7을 사용하고 있었습니다. 그래서 이 예외를 만날 수 있었지요 ㅋ

맥의 JRE(애플에서 제공하는 JDK 1.6.0_29-b11-402) 에 있는 cacerts는 사실 다음 파일을 링크하고 있습니다:

/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

이 파일의 크기는 203906 바이트인데, OpenJDK 쪽에 있는 cacerts 파일은 크기가 32바이트 밖에 안됩니다. OpenJDK에는 써드 파티들 중, 자신의 소스 공개를 원하지 않는 벤더들이 빠졌다고 그러더니 이와 관련해서 인증서도 빠진게 아닌가 하는 생각이 들었습니다.

cacerts 파일 내용은 다음의 명령어로 볼 수 있습니다:

keytool -list -v -keystore cacerts

클라이언트 쪽에 왜 이러한 파일이 필요할까? 하는 의문이 들어서 팀 분에게 물어보니 서버에서 인증서를 클라이언트에게 보내면 이 인증서가 유효한건지 아닌지 판단을 클라이언트에서 하는게 아니라 관련 인증서를 발급한 기관에 검증 요청(key를 클라이언트마다 보관할 수 없으므로)을 해야하기 때문에 클라이언트에서 이러한 리스트 형태의 정보를 가지고 있어야 하는 것 같았습니다.

그냥 JDK 1.6을 사용해도 되지만 애플에서 JDK 개발에 손을 떼서 앞으로는 OpenJDK를 써야 한다는 기사를 본 기억도 나고 그냥 JDK 1.7을 사용하고 싶어서 다음과 같이 OpenJDK 1.7의 cacert 파일을 지우고 심볼릭 링크로 교체했습니다:

ln -s /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts cacerts

테스트 해봤더니 트위터 API 호출도 정상 동작하네요 🙂

참조 사이트

http://forum.springsource.org/showthread.php?30094-trustAnchors-parameter-must-be-non-empty

http://blog.naver.com/nsjkim?Redirect=Log&logNo=140148433832

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중