java的HttpClient如何去支持无证书访问https

本文介绍了一种在没有证书的情况下调用HTTPS接口的方法。通过自定义类实现了一个不验证服务器证书的HTTPS连接,适用于一些特定场景下的需求。具体包括创建自定义的SSLContext和SocketFactory,以及如何在HttpClient中使用。

之前做调用华为认证接口时,没有证书,使用此方法,实测可用;

调用自定义类:

        if (url.startsWith("https")) {
			Protocol myhttps = new Protocol("https",new MySecureProtocolSocketFactory(), 8445);
			Protocol.registerProtocol("https", myhttps);
		}
		String responseMsg = "";
		// 构造HttpClient的实例
		HttpClient httpClient = new HttpClient();
		httpClient.getParams().setContentCharset("GBK");
		// 构造PostMethod的实例
		PostMethod postMethod = new PostMethod(url);

自定义类:


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.SecureProtocolSocketFactory;    
    
public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {    
    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();    
        }    
        return sslcontext;    
    }    
        
    private SSLContext getSSLContext() {    
        if (this.sslcontext == null) {    
            this.sslcontext = createSSLContext();    
        }    
        return this.sslcontext;    
    }    
        
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)    
            throws IOException, UnknownHostException {    
        return getSSLContext().getSocketFactory().createSocket(    
                socket,    
                host,    
                port,    
                autoClose    
            );    
    }    
    
    public Socket createSocket(String host, int port) throws IOException,    
            UnknownHostException {    
        return getSSLContext().getSocketFactory().createSocket(    
                host,    
                port    
            );    
    }    
        
        
    public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)    
            throws IOException, UnknownHostException {    
        return 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) {    
            return 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);    
            return 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() {    
            return new X509Certificate[]{};    
        }    
    }    
        
    
}    

 

转载于:https://my.oschina.net/qiaojj/blog/1926315

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值