Apache Commons를 사용하여 Java의 보안 서버에 연결 httpclient 3.1 validatorexception 던지기
-
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 년 이상 유효합니다. 그런 다음 표시된 코드를 사용하여 인증서 검사를 우회하려고했습니다.자바에서 신뢰할 수있는 호스트 및 인증서 점검을 우회하는 방법"그러나 예외는 여전히 발생합니다.
내가 뭘 잘못하고 있죠?
서버에 성공적으로 연결하려면 어떻게해야합니까?
해결책
이 오류는 인증서 체인을 검증 할 수 없음을 의미합니다. 가능한 원인은
- 루트 CA는 귀하의 JRE에 의해 신뢰되지 않습니다.
- 인증서는 중간 인증서에 의해 서명되지만 서버는 인증서와 함께 보내지 않습니다.
루트 인증서 목록을 얻는 방법은 다음과 같습니다.
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v
중간 인증서가 전송되는지 확인하는 Java 방법을 모르겠습니다. 나는 그것을 위해 OpensSL을 사용합니다.
openssl s_client -host example.com -port 443
서버에서 보낸 모든 인증서를 표시합니다. "인증 체인"에주의하십시오.