2013-04-05 5 views
2

Tomcat 및 저지를 사용하여 응용 프로그램을 개발 중입니다.
certificate이 만료되지 않은 valid으로 https Website에 연결해야하는이 웹 응용 프로그램 내에서. 크롬 브라우저를 통해이 웹 사이트에 로컬로 연결하면 모든 것이 잘 작동합니다! 불행히도 webapp이 포함 된 tomcat 서버는 예외를 throw합니다. 우리는 HTTPS 사이트에 연결하기 위해 Apache HttpClient (4.0)을 사용하고 있습니다 :Apache HTTP 클라이언트 javax.net.ssl.SSLPeerUnverifiedException : 피어가 인증되지 않음

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:371) 
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:126) 
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:572) 
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) 
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) 
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 

서버 인증서가 절대적으로 유효하고 thawte에서입니다. 세 가지 온라인 도구가 인증서를 성공적으로 확인했습니다. OpenSSL을 가진

Verify return code: 20 (unable to get local issuer certificate) 

문제는이 /etc/ssl/certs 대신 잘못된 경로 /usr/lib/ssl를 사용하는 것 같다 :
Openssl는 너무 문제, 간단한 오류를 나에게 세 가지 인증서를 보여주는하지만 던지고있다. 적절한 경로를 가리키는 CApath 인수를 사용하면 openssl이 제대로 작동하므로 httpClient와 관련된 문제 일 수 있습니까?

그래서 기본 클라이언트에 대한 우리의 코드는 매우 간단합니다 :

client = new DefaultHttpClient(); 
    response = client.execute(url); //this throws the exception 
    EntityUtils.consume(response.getEntity()); 

그것은 사용자 정의 TrustedManager를 구현하여 모든 인증서를 허용하는 옵션이 아니에요! 더 많은 CA가 JDK/JRE의 일부가 아니므로 keystore에 수동으로 인증서를 가져 오거나 사용자 정의 인증서를 사용해야합니다. 그러나 thawte는 잘 알려진 CA이므로 기본적으로 작동하지 않아야합니까?

http-bio-8080-exec-1, handling exception: javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path validation failed: 
java.security.cert.CertPathValidatorException: basic constraints check failed: 
pathLenConstraint violated - this cert must be the last cert in the certification path 

내가 어떤 도움을 주셔서 감사합니다 것입니다 : 나는이 문제에 대한 자세한 정보를 가질 수 있도록

편집

나는 catalina.sh에서 javax.debug 속성을 설정 않았다! 미리 감사드립니다.

+0

을 가져올 때까지 변태가 작동하지 않았다 7 Thawte에 있다는 것을 나에게 보여? – beny23

+0

@ beny23 나는 내가 4.x를 사용하고 있다고 말했다. – Alexander

+0

어떤 자바 버전인가? – beny23

답변

5

좋아요, 잘 됐습니다! thawte는 잘 알려진 CA이지만 Java SSL에는 문제가있는 것으로 보입니다. openssl를 통해 SSL 인증서를 다운로드 한 후 :

keytool -import -alias myAlias -file theCert.pem -keystore lib/security/cacerts 

자바 SSL이 아니었다 왜 아무 생각이 :

echo |\ 
openssl s_client -connect ${REMHOST}:${REMPORT} 2>&1 |\ 
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' 

을하고 PEM 파일로 저장, 나는 자바 키 저장소에 수동 가져 오기를했다 thawte 인증서를 올바르게 확인할 수 있습니다. 키 스토어 목록

은 표준 키 저장소에 인증서를 신뢰하지만 수동으로`HttpClient`으로 사용하는 자바의 버전 PEM 파일

0

설정을 이해하려고합니다. Tomcat에 SSL 인증서 (Thwate 발급)가 설치되어 있으며 Internet Explorer 나 Firefox 또는 Chrome을 사용하여 SSL을 통해 정상적으로 사이트에 액세스 할 수 있습니다.

그러나 HttpClient를 사용하여 액세스하려고하면 위의 오류 메시지가 나타납니다.

맞습니까?

오류는 클라이언트가 CA를 신뢰하지 않는다는 것을 분명히 나타냅니다. 그러나 인증서가 Thwate에 의해 서명 된 경우 (그리고 제대로 설치되어 있고 IE/Firefox 등을 통해 액세스 할 수 있음) 정상적으로 작동해야합니다.

+0

거의 맞습니다. 우리는 다른 회사를 위해 webapp을 개발했습니다. 이 webapp는 회사에서 제공하는 https 웹 사이트에 연결해야합니다. 더 이상 웹 사이트가 thawte에 의한 인증서를 사용하고 있습니다. 유효하고 만료는 아니지만, 우리 아파치 HttpClient는 위에 언급 된 예외를 던집니다. 로컬로, 내 브라우저 (chrome)에서이 웹 사이트에 제대로 액세스 할 수 있지만 서버에서는이 오류가 있습니다. Tomcat 서버에 인증서를 설치해야합니까? 그렇다면 어떻게해야합니까? 내 키 체인 (맥)에서 그것을 수출하고 노력없이 keytool을 통해 그것을 설치했지만 ... – Alexander

+0

흠, 그것은 크롬을 통해 작동하지만 HttpClient를 통해 작동하지 않습니다. 전에 HttpClient를 사용하지 않았습니다. 자바 컨테이너에서 실행됩니까? 그렇다면, Thwate가 Java 컨테이너에 의해 신뢰되는지 확인해야합니다. keytool 명령을 사용하여 java 설치의 "cacerts"파일에있는 certs를 나열하십시오. – bubbly

+0

내 anser를 편집했습니다. openssl에 잘못된 디렉토리를 가리키는 문제가 있습니다. 이것도 문제가 될 수 있습니까? – Alexander

관련 문제