Подключение к защищенному серверу на Java с использованием Apache Commons HttpClient 3.1, вызывающее исключение ValidatorException
-
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", однако исключение все равно генерируется.
Что я делаю не так?
Как я могу успешно подключиться к серверу?
Решение
Эта ошибка означает, что он не может проверить цепочку сертификатов.Возможными причинами являются,
- Ваш JRE не доверяет корневому центру сертификации.
- Сертификат подписан промежуточным сертификатом, но сервер не отправляет его вместе с сертификатом.
Вот как получить список корневых сертификатов,
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v
Я не знаю ни одного Java-способа проверить, отправлен ли промежуточный сертификат.Для этого я использую openssl,
openssl s_client -host example.com -port 443
Покажет вам все сертификаты, отправленные сервером.Обратите внимание на "Цепочку сертификатов".