Apache Commons를 사용하여 Java의 보안 서버에 연결 httpclient 3.1 validatorexception 던지기

StackOverflow https://stackoverflow.com/questions/1623924

  •  06-07-2019
  •  | 
  •  

문제

나는 보안 서버에 연결하려고합니다. Apache Commons HttpClient 3.1.
문제는 응용 프로그램이 연결할 때마다 던지는 것입니다.

Sun.security.validator.validatorexception.

여기에 있습니다 스택 트레이스:

javax.net.ssl.sslhandshakeexception : sun.security.validator.validatorexception : pkix 경로 검증 실패 : java.security.cert.certpathvalidatorexception : 주제/발행자 이름 체인 javax.net.ssl.sslhandshakeexception : sun.security. validator. ValidAtoreXception : PKIX 경로 유효성 검증 실패 : java.security.cert.certpathvalidatorexception : com.sun.net.ssl.internal.ssl.alerts.getssssslexception (alerts.java:174)에서 com.sun.net.ssl.internal.ssl.alerts.getssssssslesception에서 실패했습니다. net.ssl.internal.ssl.sslsocketimpl.fatal (com.sun.net.ssl.internal.ssl.handshaker.fatalse (handshaker.java:187)의 com.sun.net.ssl. com.sun.net.ssl.internal.ssl.clienthandshaker.servercertificate (clienthandshaker.java:1035)의 internation.ssl.handshaker.fatalse (handshaker.java:181). com.sun.sl.handshaker.handshaker.processloop (handshaker.java:516)의 clienthandshaker.processmessage (clienthandshaker.java:124)는 com.sun.net.sl.internal.ssl.handshaker.proces com.sun.net.ssl.internal.ssl.sslsl.sslsocketimpl.readrecord (sslsocketimpl.java:884)에서 s_record (handshaker.java:454)는 com.sun.net.sn.sl.internal.ssl.sslsl.slsketimpl.performinitialshake (sslsekestimpl. com.sun.net.ssl.internal.ssl.sslsocketimpl.writerecord (sslsocketimpl.java:623)의 java : 1112) at com.sun.net.ssl.internal.ssl.appoutputstream.write (appoutputstream.java:59) at Java.io.bufferedOutputStream.flushBuffer (bufferedOutputStream.java:65) at java.io.bufferedOutputStream.flush (bufferedOutputStream.java:123) org.apache.commons.httpclients.method.writectod. ) at org.apache.commons.httpclient.httpmethodbase.writequest (httpmethodbase.java:2114) at org.apache.commons.httpclient.httpmethodbase.execute (httpmethodbase.java.java.java.java:1096) at org.hompons.hompons.hompons. org.apache.commons.httpclient.httpmethoddirector.executemethod (httpmethoddirector.java:171) at org.apache.co. mmons.httpclient.httpclient.executemethod (httpclient.java:397) at org.apache.commons.httpclient.httpclient.executemethod (httpclient.java:323)의 balanceschecer.connector.conn (connector.conector.java:23). .connector.connector.RawPost (Connector.java:99)의 balanceschecker.connector.connector.post (Connector.java:111)의 balanceschecker.login.login.login (login.java:87)의 balanceschecker.main.main ( Main.java:21)에 의한 : Sun.security.validator.Validatorexception : PKIX 경로 검증 실패 : Java.Security.cert.CertPathValidatorException : 주제/발행자 이름 체인 점검 SUN.SUCURITY.VALIDATOR.PKIXVALIDATOR.DAVOLIDATE (PKIXVALIDATOR. java : 251)에서 sun.security.validator.pkixvalidator.dovalidate (pkixvalidator.java:234) at sun.security.validator.pkixvalidator.enginevalidate (sun.securitor.validator.validator.securitor.validator.validator.validator.validator. .java : 218) at com.sun.net.ssl.internal.ssl.x509trustmanagerimpl.validate (x509trustmanagerimpl.java:126)에서 com.sun. net.ssl.internal.ssl.x509trustmanagerimpl.checkservertrusted (x509trustmanagerimpl.java:209) at com.sun.net.ssl.internal.ssl.x509trustmanagerimpl.checksertrusted (x509trustmanagerimpl.java:249). internal.ssl.clienthandshaker.servercertificate (clienthandshaker.java:1014) ... pkixmastercertpathvalidator.java:139)에서 sun.security.provider.certpath.pkixcertpathvalidator.dovalidate (pkixcertpathvalidator.java:326) at sun.security.provider.cert.pkixcertvalidator.ugcercertvalidator (pkixcercertvalidator). .certpathvalidator.validate (certpathvalidator.java:250) sun.security.validator.pkixvalidator.dovalidate (pkixvalidator.java:246) ... 28 more

그녀는 내가 사용하는 코드 (편집 및 압축)

installAllTrustManager();

PostMethod post = new PostMethod(server_path);
NameValuePair[] data = new NameValuePair {
   new NameValuePair("Username", username), 
   new NameValuePair("Password", password) 
};
        post.setRequestBody(data);
        post.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
try {
            HttpClient hc = new HttpClient();
            int result2 = hc.executeMethod(post);
            if (result2 != HttpStatus.SC_OK) {
                throw new IOException("HTTP Status Not OK: " + result2);
            }
            return post.getResponseBodyAsStream();
        } finally {
            post.releaseConnection();
        }

사이트의 인증서를 살펴 보았고 여전히 1 년 이상 유효합니다. 그런 다음 표시된 코드를 사용하여 인증서 검사를 우회하려고했습니다.자바에서 신뢰할 수있는 호스트 및 인증서 점검을 우회하는 방법"그러나 예외는 여전히 발생합니다.

내가 뭘 잘못하고 있죠?
서버에 성공적으로 연결하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

이 오류는 인증서 체인을 검증 할 수 없음을 의미합니다. 가능한 원인은

  1. 루트 CA는 귀하의 JRE에 의해 신뢰되지 않습니다.
  2. 인증서는 중간 인증서에 의해 서명되지만 서버는 인증서와 함께 보내지 않습니다.

루트 인증서 목록을 얻는 방법은 다음과 같습니다.

keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v

중간 인증서가 전송되는지 확인하는 Java 방법을 모르겠습니다. 나는 그것을 위해 OpensSL을 사용합니다.

openssl s_client -host example.com -port 443

서버에서 보낸 모든 인증서를 표시합니다. "인증 체인"에주의하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top