<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    httpclient ssl support

    手頭上一些工作,需要經(jīng)常訪問公司內(nèi)網(wǎng)的數(shù)據(jù),為了減少重復的勞動力,就考慮程序幫忙爬取信息數(shù)據(jù)。
    apache下httpclient是一個很好的工具,不過公司內(nèi)網(wǎng)是使用HTTPS協(xié)議的,于是乎,就需要考慮如何讓httpclient支持https。
    支持ssl的關(guān)鍵,在于如何創(chuàng)建一個SSLSocket,幸好,httpclient提供了支持。

    請看:
    org.apache.commons.httpclient.protocol.ProtocolSocketFactory
    javadocs:A factory for creating Sockets.

    實現(xiàn)一個簡單的EasySSLProtocolSocketFactory,詳見代碼:
    public class EasySSLProtocolSocketFactory implements ProtocolSocketFactory {

        
    private SSLContext sslcontext = null;

        
    private String     ksfile;
        
    private String     tksfile;
        
    private String     kspwd;
        
    private String     tkspwd;

        
    public EasySSLProtocolSocketFactory(String ks, String kspwd, String tks, String tkspwd){
            
    this.ksfile = ks;
            
    this.kspwd = kspwd;
            
    this.tksfile = tks;
            
    this.tkspwd = tkspwd;
        }

        
    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(final String host, final int port, final InetAddress localAddress, final int localPort,
                                   
    final 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;
            }
        }

        
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
            
    return getSSLContext().getSocketFactory().createSocket(host, port);
        }

        
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
                                                                                           UnknownHostException {
            
    return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose);
        }

        
    private SSLContext createEasySSLContext() {
            
    try {
                SSLContext context 
    = SSLContext.getInstance("SSL");

                KeyManagerFactory kmf 
    = KeyManagerFactory.getInstance("SunX509");
                TrustManagerFactory tmf 
    = TrustManagerFactory.getInstance("SunX509");

                KeyStore ks 
    = KeyStore.getInstance("JKS");
                KeyStore tks 
    = KeyStore.getInstance("JKS");

                ks.load(
    new FileInputStream(ksfile), kspwd.toCharArray());
                tks.load(
    new FileInputStream(tksfile), tkspwd.toCharArray());

                kmf.init(ks, kspwd.toCharArray());
                tmf.init(tks);

                context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), 
    null);
                
    return context;
            } 
    catch (Exception e) {
                
    throw new HttpClientError(e.toString());
            }
        }

        
    private SSLContext getSSLContext() {
            
    if (this.sslcontext == null) {
                
    this.sslcontext = createEasySSLContext();
            }
            
    return this.sslcontext;
        }

    }

    備注:
    至于ssl相關(guān)的知識,和如何創(chuàng)建java key store,可見:
    SSL雙向認證java實現(xiàn)


    如何使用,也簡單:
    Protocol.registerProtocol("https", new Protocol("https", new EasySSLProtocolSocketFactory(KS_FILE, KS_PWD, TKS_FILE, TKS_PWD), 443))

    官方資料:
    http://hc.apache.org/httpclient-3.x/sslguide.html

    演示代碼:
    httpclient-ssl.zip

    posted on 2010-01-30 14:39 stone2083 閱讀(2911) 評論(0)  編輯  收藏 所屬分類: java

    主站蜘蛛池模板: 一级毛片免费观看不收费| 亚洲一线产区二线产区区| 99久久成人国产精品免费| jizzjizz亚洲| 永久免费无码网站在线观看个| 日本大片在线看黄a∨免费| 亚洲精品永久在线观看| 成人爽A毛片免费看| 亚洲另类无码专区丝袜| 免费无码黄网站在线观看| 午夜亚洲WWW湿好爽 | 精品久久久久久久久亚洲偷窥女厕| 拍拍拍又黄又爽无挡视频免费| 亚洲一区二区三区高清不卡 | 免费萌白酱国产一区二区| 国产精品亚洲а∨天堂2021| 四虎影院永久免费观看| 一级毛片免费全部播放| 亚洲韩国精品无码一区二区三区| 国产成人AV免费观看| 亚洲邪恶天堂影院在线观看| 午夜免费1000部| 久久久久久久久无码精品亚洲日韩| 国产一级做a爱免费视频| 久草免费福利在线| 亚洲国产精品综合一区在线| 在线jlzzjlzz免费播放| 人禽伦免费交视频播放| 亚洲视频在线免费播放| 成年丰满熟妇午夜免费视频| 免费看又黄又爽又猛的视频软件| 亚洲精品国产精品乱码视色 | 51视频精品全部免费最新| 亚洲 暴爽 AV人人爽日日碰| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 456亚洲人成影院在线观| 亚洲精品国产高清嫩草影院| 免费精品一区二区三区第35 | 久久免费线看线看| 亚洲欧美日韩中文高清www777| 亚洲人成无码www久久久|