Я пытаюсь подключиться к безопасному серверу, используя 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 », однако исключение по-прежнему выдается.
Что я делаю не так?
Как успешно подключиться к серверу?