ValidatorExceptionをスローしてApache Commons HttpClient 3.1を使用してJavaでセキュアサーバーに接続する
-
06-07-2019 - |
質問
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)で 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.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)で 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(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で。
解決
このエラーは、証明書チェーンを検証できないことを意味します。考えられる原因は、
- ルートCAはJREによって信頼されていません。
- 証明書は中間証明書によって署名されていますが、サーバーは証明書とともに証明書を送信していません。
ルート証明書のリストを取得する方法は次のとおりです
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v
中間証明書が送信されたかどうかを確認するJavaの方法がわかりません。そのためにopensslを使用します。
openssl s_client -host example.com -port 443
サーバーから送信されたすべての証明書が表示されます。 「証明書チェーン」に注意してください。