2012-04-05 3 views
2

아파치 HttpClient를 사용하여 제 3 자에게 https API 호출을하는 grails 1.3.7 애플리케이션이 있습니다. 타사 URL에 유효한 인증서가 있습니다. 나는 다음과 같이 요청을 만들고 실행한다.javax.net.ssl.SSLPeerUnverifiedException : 프로덕션 환경에서만 피어가 인증되지 않는 이유는 무엇입니까?

내 프로젝트를 dev 모드에서 실행할 때 잘 동작한다. 나는 또한 오류없이 말과 브라우저에서 동일한 URL을 직접 호출 할 수 있습니다. 내 프로젝트는 war 파일에 내장 정의 인증서/키 스토어가있는 바람둥이 인스턴스에 넣어 그러나, 일단 클라이언트는 내 요청이 다음 IOException를 표시해 실패 시작, HTTPS를 사용하여 미국에 연결할 수 있도록 :

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

나는 여기서 실패의 요점을 알아 내려고 노력하고있다.

왜 curl 또는 내 dev 모드에서 https 요청을 만드는 것이 https 구성된 tomcat 인스턴스에서 https 요청을하는 것과 다른가요?

tomcat 인스턴스는 공개적으로 액세스 할 수 없지만 브라우저에서 연결할 때 인증서 문제가 없습니다 (Chrome에서 자세한 curl 요청과 마찬가지로 인증서가 정상적으로 처리됩니다).

나는 어떤 스트레칭으로도 https/ssl 전문가가 아니므로 무엇이 잘못되었는지, 왜 잘못되었는지, 어떻게 고칠 수 있는지에 대한 설명을 듣고 싶습니다. 다른 필요한 정보를 제공 할 수 있습니다.

--- 업데이트 --- 아래에 제안 나는 javax.net.debug를 활성화 출력은 다음과 같은 오류가 포함 :

java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be\ 
non-empty 

내 인터넷 검색은 내가이 문제가 난 때문이라고 생각했다을

-Djavax.net.ssl.trustStore=/path/to/tomcat/conf/myStore.jks 

그게 사실이라면 내가 myStore.jks에 필요한 것들을 추가하고 모두가 행복하도록 기본값을 재정의 할 수 없습니다 방법 : 바람둥이를 시작할 때 다음과 같은 자바 옵트를 사용하고 계십니까?

+0

'javax.net.debug'속성을 사용하여 SSL 디버깅을 켜보십시오. http://www.herongyang.com/JDK/SSL-Socket-Communication-Debug-javax-net-debug.html –

+0

을 참조하십시오. 나는 그것을 가능하게함으로써 제공된 작은 정보로 게시물을 갱신했다. – twilbrand

답변

2

나를위한 해결책은 우리가 자바와 함께 우리 자신의 기본 자바 트러스트 스토어를 오버라이드한다는 것이 었습니다. 이로 인해 myStore.jks에 기본 루트 인증서가 없었기 때문에 제 3자가 보낸 인증서가 유효하지 않은 것으로 나타났습니다.

자체 서명 된 인증서를 기본 Java 파일 (/ lib/security/cacerts)에 추가하고 java opt를 제거하면 모든 것이 잘되었습니다.

다른 대안은 기본 java 저장소에있는 모든 것을 사용자 지정 저장소에 추가하고 여전히 java opt를 사용하는 것입니다. 어떤 상황에서든지 유지 관리가 가능합니다.

2

나는이 오류를 여러 번 보았습니다. 다음 유틸리티를 사용하여 SSL을 사용하는 사이트에서 인증서를 가져 왔습니다. 여기로 가서 InstallCert을 잡아라. 이 유틸리티를 컴파일하고 실행하십시오. 이 유틸리티에 의해 생성 된 파일을 키 저장소로 사용할 수 있습니다.

관련 문제