当不需要任何证书访问https时,java中先实现一个MySSLProtocolSocketFactory类忽略证书的信任
package com.tgb.mq.producer.utils; 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.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; 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.SecureProtocolSocketFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MySSLProtocolSocketFactory implements SecureProtocolSocketFactory { private static final Logger logger = LoggerFactory.getLogger(MySSLProtocolSocketFactory.class); private static SSLContext context = null; SSLContext createSSLContext() { try { context = SSLContext.getInstance("SSL"); context.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new SecureRandom()); } catch (NoSuchAlgorithmException e) { logger.debug(e.getMessage()); } catch (KeyManagementException e) { logger.debug(e.getMessage()); } return context; } SSLContext getSSLContext() { if (context != null) { return createSSLContext(); } else { return context; } } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket(host, port); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket(host, port, localHost, localPort); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort, HttpConnectionParams arg4) throws IOException, UnknownHostException, ConnectTimeoutException { if (arg4 == null) { try { throw new Exception("参数为空"); } catch (Exception e) { logger.debug(e.getMessage()); } } int timeout = arg4.getConnectionTimeout(); SSLSocketFactory socketFactory = getSSLContext().getSocketFactory(); if (timeout == 0) { return socketFactory.createSocket(host, port, localHost, localPort); } else { Socket socket = socketFactory.createSocket(); SocketAddress localAdd = new InetSocketAddress(localHost, localPort); SocketAddress remoteAdd = new InetSocketAddress(host, port); socket.bind(remoteAdd); socket.connect(localAdd, timeout); return socket; } } // 自定义 private static class TrustAnyTrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 重写x509TrustManager中的checkClentTrusted方法,为空默认客户端是可信的 } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 重写x509TrustManager中的checkServerTrusted方法,为空默认服务器是可信的 } @Override public X509Certificate[] getAcceptedIssuers() { // 重写x509TrustManager中的getAcceptedIssuers方法,默认接受发行人的证书为空 return new X509Certificate[] {}; } } }
在请求的代码中加入Protocol的代码就行
HttpClient httpClient = new HttpClient(); if (url.startsWith("https")) { Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory(), 443); Protocol.registerProtocol("https", myhttps); }