当前位置: 首页 >Java技术 > HttpClient_javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关

HttpClient_javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关

用httpclient访问https 资源时,会出现异常,与环境也有关系,有些机器请求正常.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat com.sun.net.ssl.inteal.ssl.Alerts.getSSLException(Alerts.java:174)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)at com.sun.net.ssl.inteal.ssl.Handshaker.fatalSE(Handshaker.java:198)at com.sun.net.ssl.inteal.ssl.Handshaker.fatalSE(Handshaker.java:192)at com.sun.net.ssl.inteal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1074)at com.sun.net.ssl.inteal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:128)at com.sun.net.ssl.inteal.ssl.Handshaker.processLoop(Handshaker.java:529)at com.sun.net.ssl.inteal.ssl.Handshaker.process_record(Handshaker.java:465)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1147)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1131)at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)at com.msd.payCenter.msdPay.yeePay.util.HttpUtils.URLGet(HttpUtils.java:67)at com.msd.payCenter.msdPay.yeePay.service.impl.YeePayServiceImpl.yeeAutoCheckOrder(YeePayServiceImpl.java:298)at com.msd.payCenter.msdPay.AutoCheckOrderServiceImpl.autoCheckOrder(AutoCheckOrderServiceImpl.java:83)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

 

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat com.sun.net.ssl.inteal.ssl.Alerts.getSSLException(Alerts.java:174)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)at com.sun.net.ssl.inteal.ssl.Handshaker.fatalSE(Handshaker.java:198)at com.sun.net.ssl.inteal.ssl.Handshaker.fatalSE(Handshaker.java:192)at com.sun.net.ssl.inteal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1074)at com.sun.net.ssl.inteal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:128)at com.sun.net.ssl.inteal.ssl.Handshaker.processLoop(Handshaker.java:529)at com.sun.net.ssl.inteal.ssl.Handshaker.process_record(Handshaker.java:465)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1147)at com.sun.net.ssl.inteal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1131)at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)at com.msd.payCenter.msdPay.yeePay.util.HttpUtils.URLGet(HttpUtils.java:67)at com.msd.payCenter.msdPay.yeePay.service.impl.YeePayServiceImpl.yeeAutoCheckOrder(YeePayServiceImpl.java:298)at com.msd.payCenter.msdPay.AutoCheckOrderServiceImpl.autoCheckOrder(AutoCheckOrderServiceImpl.java:83)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

 

解决方法:

增加一个自己的https协议类 MySSLSocketFactory.java

package com.nassir.hc3;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.SocketFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.commons.httpclient.ConnectTimeoutException;import org.apache.commons.httpclient.params.HttpConnectionParams;import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;public class MySSLSocketFactory implements ProtocolSocketFactory {static {System.out.println(">>>>in MySSLSocketFactory>>");}private SSLContext sslcontext = null;private SSLContext createSSLContext() {SSLContext sslcontext = null;try {sslcontext = SSLContext.getInstance("SSL");sslcontext.init(null,new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();}retu sslcontext;}private SSLContext getSSLContext() {if (this.sslcontext == null) {this.sslcontext = createSSLContext();}retu this.sslcontext;}public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException {retu getSSLContext().getSocketFactory().createSocket(socket, host,port, autoClose);}public Socket createSocket(String host, int port) throws IOException,UnknownHostException {retu getSSLContext().getSocketFactory().createSocket(host, port);}public Socket createSocket(String host, int port, InetAddress clientHost,int clientPort) throws IOException, UnknownHostException {retu getSSLContext().getSocketFactory().createSocket(host, port,clientHost, clientPort);}public Socket createSocket(String host, int port, InetAddress localAddress,int localPort, HttpConnectionParams params) throws IOException,UnknownHostException, ConnectTimeoutException {if (params == null) {throw new IllegalArgumentException("Parameters may not be null");}int timeout = params.getConnectionTimeout();SocketFactory socketfactory = getSSLContext().getSocketFactory();if (timeout == 0) {retu socketfactory.createSocket(host, port, localAddress,localPort);} else {Socket socket = socketfactory.createSocket();SocketAddress localaddr = new InetSocketAddress(localAddress,localPort);SocketAddress remoteaddr = new InetSocketAddress(host, port);socket.bind(localaddr);socket.connect(remoteaddr, timeout);retu socket;}}private static class TrustAnyTrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {retu new X509Certificate[] {};}}}

 

package com.nassir.hc3;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.SocketFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.commons.httpclient.ConnectTimeoutException;import org.apache.commons.httpclient.params.HttpConnectionParams;import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;public class MySSLSocketFactory implements ProtocolSocketFactory {static {System.out.println(">>>>in MySSLSocketFactory>>");}private SSLContext sslcontext = null;private SSLContext createSSLContext() {SSLContext sslcontext = null;try {sslcontext = SSLContext.getInstance("SSL");sslcontext.init(null,new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom());} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (KeyManagementException e) {e.printStackTrace();}retu sslcontext;}private SSLContext getSSLContext() {if (this.sslcontext == null) {this.sslcontext = createSSLContext();}retu this.sslcontext;}public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException {retu getSSLContext().getSocketFactory().createSocket(socket, host,port, autoClose);}public Socket createSocket(String host, int port) throws IOException,UnknownHostException {retu getSSLContext().getSocketFactory().createSocket(host, port);}public Socket createSocket(String host, int port, InetAddress clientHost,int clientPort) throws IOException, UnknownHostException {retu getSSLContext().getSocketFactory().createSocket(host, port,clientHost, clientPort);}public Socket createSocket(String host, int port, InetAddress localAddress,int localPort, HttpConnectionParams params) throws IOException,UnknownHostException, ConnectTimeoutException {if (params == null) {throw new IllegalArgumentException("Parameters may not be null");}int timeout = params.getConnectionTimeout();SocketFactory socketfactory = getSSLContext().getSocketFactory();if (timeout == 0) {retu socketfactory.createSocket(host, port, localAddress,localPort);} else {Socket socket = socketfactory.createSocket();SocketAddress localaddr = new InetSocketAddress(localAddress,localPort);SocketAddress remoteaddr = new InetSocketAddress(host, port);socket.bind(localaddr);socket.connect(remoteaddr, timeout);retu socket;}}private static class TrustAnyTrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException {}public X509Certificate[] getAcceptedIssuers() {retu new X509Certificate[] {};}}}

 

请求类:

/** *  */package com.nassir.hc3;import java.io.IOException;import java.io.InputStream;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.commons.httpclient.protocol.Protocol;/** * @author nassir wen * @data 2012-3-31 下午05:09:13 * @version V2.5 * @Company: MSD. * @Copyright Copyright (c) 2012 */public class HttpsRequest {/** *  * @param url * @retu */public static String post(String url) {//增加下面两行代码Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443);Protocol.registerProtocol("https", myhttps);HttpClient client = new HttpClient();HttpMethod post = new PostMethod(url);try {client.executeMethod(post);byte[] responseBody = post.getResponseBody();String result = new String(responseBody,"GBK");retu result;} catch (HttpException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {post.releaseConnection();}retu null;}}
/** *  */package com.nassir.hc3;import java.io.IOException;import java.io.InputStream;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.HttpMethod;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.commons.httpclient.protocol.Protocol;/** * @author nassir wen * @data 2012-3-31 下午05:09:13 * @version V2.5 * @Company: MSD. * @Copyright Copyright (c) 2012 */public class HttpsRequest {/** *  * @param url * @retu */public static String post(String url) {//增加下面两行代码Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443);Protocol.registerProtocol("https", myhttps);HttpClient client = new HttpClient();HttpMethod post = new PostMethod(url);try {client.executeMethod(post);byte[] responseBody = post.getResponseBody();String result = new String(responseBody,"GBK");retu result;} catch (HttpException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {post.releaseConnection();}retu null;}}

 

 

测试:

public static void main(String[] args) {System.out.println(HttpsRequest.post("https://www.alipay.com"));//支付宝做测试}
public static void main(String[] args) {System.out.println(HttpsRequest.post("https://www.alipay.com"));//支付宝做测试}

 

作者:GisClub
来源链接:https://www.cnblogs.com/gisblogs/p/4626260.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/java/112357.html

标签:Security
分享给朋友:

“HttpClient_javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关” 的相关文章

SpringBoot整合SpringCloud分布式服务 2022年05月15日 21:54:11
SpringBoot整合hibeate纯注解版 2022年05月15日 21:58:07
Redis集群搭建 2022年05月15日 21:59:25
Centos 6.4最小化安装后的优化(2) 2022年05月16日 19:50:28
AIX系统下挂载外置存储 2022年05月16日 19:50:58
利用docker部署elk交换机日志分析 2022年05月16日 19:51:05
网络协议栈基本知识 2022年05月16日 20:33:52
全面了解 Java 原子变量类 2022年05月17日 20:52:45