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

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

  •  06-07-2019
  •  | 
  •  

Вопрос

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

sun.security.валидатор.Исключение ValidatorException.

Вот этот отслеживание стека:

javax.net.ssl.SSLHandshakeException Исключение:sun.security.валидатор.Исключение ValidatorException:Проверка пути PKIX сбой:java.security.сертификат.Исключение CertPathValidatorException:тема / отправитель ошибка проверки цепочки имен javax.net.ssl.SSLHandshakeException:sun.security.валидатор.Исключение ValidatorException:Проверка пути PKIX сбой:java.security.сертификат.Исключение 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.Фатальный (Handshaker.java:187) на com.sun.net.ssl.internal.ssl.Handshaker.Фатальный (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.java:123) в org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:506) в org.apache.commons.httpclient.HttpMethod base.writeRequest(HttpMethod base.java:2114) в org.apache.commons.httpclient.HttpMethod base.execute(HttpMethod base.java:1096) в org.apache.commons.httpclient.HttpMethod director.executeWithRetry(HttpMethod Director.java:398) в org.apache.commons.httpclient.HttpMethod director.ExecuteMethod(HttpMethod Director.java:171) в org.apache.commons.httpclient.HttpClient.ExecuteMethod(HttpClient.java:397) в org.apache.commons.httpclient.HttpClient.ExecuteMethod(HttpClient.java:323) в balanceschecker.connector.Connector.conn(Connector.java:27) в balanceschecker.connector.Соединитель.RawPost(Connector.java:99) в balanceschecker.connector.Соединитель.Post (Connector.java:111) в balanceschecker.войти.Вход.Войти (Login.java:87) при проверке баланса.Main.main(Main.java:21), вызванной:sun.security.валидатор.Исключение ValidatorException:Проверка пути PKIX сбой:java.security.сертификат.Исключение CertPathValidatorException:субъект / отправитель не удалось выполнить проверку цепочки имен в sun.security.validator.PKIXValidator.Завершить проверку (PKIXValidator.java:251) в sun.security.validator.PKIXValidator.Завершить проверку (PKIXValidator.java:234) в sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:158) в 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.сертификат.Исключение CertPathValidatorException:тема / имя отправителя не удалось выполнить проверку цепочки в sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:139) в sun.security.provider.certpath.проверить.PKIXCertPathValidator.Выполнить проверку (PKIXCertPathValidator.java:326) в sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:178) в java.security.cert.CertPathValidator.validate(CertPathValidator.java:250) в sun.security.validator.PKIXValidator.Довалидат(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. Ваш 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