Подключение к защищенному серверу в Java с использованием Apache Commons HttpClient 3.1, вызывающего исключение ValidatorException

Я пытаюсь подключиться к защищенному серверу, используя Apache Commons HttpClient 3.1.
Проблема в том, что каждый раз, когда приложение подключается,

sun.security.validator.ValidatorException.

Вот stacktrace:

Вот код, который я использую (отредактировал и немного сжал)

Я посмотрел сертификаты сайта, они действительны больше года. Затем я попытался обойти проверку сертификата, используя код, показанный в "Как сделать обход доверенного хоста и проверки сертификата в Java ", однако исключение все равно генерируется.


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();
        }

Что я делаю неправильно?
Как я могу успешно подключиться к серверу?

Эта ошибка означает, что не удается проверить цепочку сертификатов. Возможные причины:


person Kryten    schedule 26.10.2009    source источник


Ответы (1)


Вот как получить список корневых сертификатов,

  1. Сертификат подписан промежуточным сертификатом, но сервер не отправляет его вместе с сертификатом.
  2. 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.getSSLException (Alerts.java:174) в com.sun. net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1611) на com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:187) на com.sun.net.ssl. internal.ssl.Handshaker.fatalSE (Handshaker.java:181) по адресу com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1035) по адресу com.sun.net.ssl.internal.ssl. ClientHandshaker.processMessage (ClientHandshaker.java:124) по адресу com.sun.net.ssl.internal.ssl.Handshaker. processLoop (Handshaker.java:516) по адресу com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:454) по адресу com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord (SSLSocketImpl. java: 884) на com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1112) на com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord (SSLSocketImpl.java:623) в com.sun.net.ssl.internal.ssl.AppOutputStream.write (AppOutputStream.java:59) в java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65) в java.io.BufferedOutputStream.flush (BufferedOutputStream.flush (BufferedOutputStream. : 123) по адресу org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:506) по адресу org.apache.commons.httpclient.HttpMethodBase.writeRequest (. httpclient.HttpMethodBase.execute (HttpMethodBase.java:1096) на org.apache.com mons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:398) на org.apache.com 397) на org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:323) на balanceschecker.connector.Connector.conn (Connector.java:27) на balanceschecker.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.security.validator.PKIXValidator.doValidate (PKIXValidator.java:251 ) по адресу sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:234) по адресу sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:158) по адресу sun.security.validator.Validator.validate ( 218) по адресу com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:126) по адресу com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl) в com.imagerManagerImpl.checkServerTrusted (X509Trust) .sun.net.ssl.internal.ssl.X509Tr ustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:249) в com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1014) ... еще 21 Причина: java.security. subject.C Ошибка проверки цепочки имени / эмитента на sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) на sun.security.provider.certpath.PKIXCertPathValidator.doValidator.doValidator.pkixCertPathValidator.doValidator.doValidator.pkixCertPathValidator.doValidator.doValidurity.pkixCertPathValidator.doValidator.doValidator.jpg .certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:178) по адресу java.security.cert.CertPathValidator.validate (CertPathValidator.java:250) по адресу sun.security.validator.PKIX.java: Validate.PKIX. Еще 28

Я не знаю способа Java проверить, отправлен ли промежуточный сертификат. Я использую для этого openssl,

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

Покажет вам все сертификаты, отправленные сервером. Обратите внимание на «Цепочку сертификатов».

openssl s_client -host example.com -port 443

JRE не доверяет корневому ЦС.

person ZZ Coder    schedule 26.10.2009