使用Apache Commons HttpClient 3.1连接到Java中的安全服务器引发异常

使用Apache Commons HttpClient 3.1连接到Java中的安全服务器引发异常,java,connection,Java,Connection,我正在尝试使用Apache Commons HttpClient 3.1连接到安全服务器。 问题在于每次应用程序连接时都会抛出 sun.security.validator.validator异常 以下是堆栈跟踪: javax.net.ssl.SSLHandshakeException: sun.security.validator.validator异常:PKIX路径验证 失败:java.security.cert.CertPathValidator异常:主题/颁发者 名称链接检查失败java

我正在尝试使用Apache Commons HttpClient 3.1连接到安全服务器。
问题在于每次应用程序连接时都会抛出

sun.security.validator.validator异常

以下是堆栈跟踪:

javax.net.ssl.SSLHandshakeException: sun.security.validator.validator异常:PKIX路径验证 失败:java.security.cert.CertPathValidator异常:主题/颁发者 名称链接检查失败javax.net.ssl.SSLHandshakeException: sun.security.validator.validator异常:PKIX路径验证 失败:java.security.cert.CertPathValidator异常:主题/颁发者 名称链接检查失败 位于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_记录(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.validator异常:PKIX路径验证 失败:java.security.cert.CertPathValidator异常:主题/颁发者 名称链接检查失败 位于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.ClientHandshaker.serverCertificate(ClientHandshaker.java:1014) ... 21更多原因:java.security.cert.CertPathValidator异常:主体/颁发者名称 链接检查失败 位于sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:139) 位于sun.security.provider.certpath.pkixertpathvalidator.doValidate(pkixertpathvalidator.java:326) 位于sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:178) 位于java.security.cert.CertPathValidator.validate(CertPathValidator.java:250) 位于sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:246) ... 28多

这是我正在使用的代码(编辑并压缩了一点)

installAllTrustManager(); PostMethod post=新的PostMethod(服务器路径); NameValuePair[]数据=新的NameValuePair{ 新的NameValuePair(“用户名”,用户名), 新的NameValuePair(“密码”,Password) }; post.setRequestBody(数据); post.getParams().setParameter(HttpMethodParams.RETRY_处理程序,新的DefaultHttpMethodRetryHandler(3,false)); 试一试{ HttpClient hc=新的HttpClient(); int result2=hc.executeMethod(post); if(result2!=HttpStatus.SC\u OK){ 抛出新IOException(“HTTP状态不正常:+result2”); } return post.getResponseBodyAsStream(); }最后{ post.releaseConnection(); } 我看了一下网站的证书,它们仍然有效一年多。 然后,我尝试使用“”中显示的代码绕过证书检查,但是仍然引发异常

我做错了什么?

如何成功连接到服务器?

此错误意味着无法验证证书链。可能的原因是,

  • 您的JRE不信任根CA
  • 证书由中间证书签名,但服务器未将其与证书一起发送
  • 这里是如何 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(); }
    keytool -list -keystore $JAVA_HOME/lib/security/cacerts -v
    
    openssl s_client -host example.com -port 443