Подключение к защищенному серверу в Java с использованием Apache Commons HttpClient 3.1, выбрасывающего ValidatorException - PullRequest
2 голосов
/ 26 октября 2009

Я пытаюсь подключиться к безопасному серверу, используя 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.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) at java.io.BufferedOutputStream.flushBuffer (BufferedOutputStream.java:65) at java.io.BufferedOutputStream.flush (BufferedOutputStream.java:123) в org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:506) в org.apache.commons.httpclient.HttpMethodBase.writeRequest (HttpMethodBase.java:2114) в org.apache.commons.httpclient.HttpMethodBase.execute (HttpMethodBase.java:1096) в org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry (HttpMethodDirector.java:398) в org.apache.commons.httpclient.HttpMethodDirector.executeMethod (HttpMethodDirector.java:171) на org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:397) на org.apache.commons.httpclient.HttpClient.executeMethod (HttpClient.java:323) at balanceschecker.connector.Connector.conn (Connector.java:27) at balanceschecker.connector.Connector.RawPost (Connector.java:99) at balanceschecker.connector.Connector.Post (Connector.java:111) at balanceschecker.login.Login.Login (Login.java:87) at balanceschecker.Main.main (Main.java:21) Вызывается: sun.security.validator.ValidatorException: проверка пути PKIX ошибка: java.security.cert.CertPathValidatorException: тема / эмитент проверка цепочки имен не удалась at sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:251) at sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:234) at sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:158) at sun.security.validator.Validator.validate (Validator.java:218) в com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:126) в com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:209) в com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:249) на com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1014)... еще 21 Причина: java.security.cert.CertPathValidatorException: имя субъекта / эмитента проверка цепочки не удалась at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) at sun.security.provider.certpath.PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:326) at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCertPathValidator.java:178) at java.security.cert.CertPathValidator.validate (CertPathValidator.java:250) at sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:246) ... еще 28

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


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

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

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

1 Ответ

6 голосов
/ 26 октября 2009

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

  1. Корневой ЦС не является доверенным для вашей JRE.
  2. Сертификат подписан промежуточным сертификатом, но сервер не отправляет его вместе с сертификатом.

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

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

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

openssl s_client -host example.com -port 443

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...