HttpClient HTTPS 工具类

来源:互联网 发布:向量化编程 编辑:程序博客网 时间:2024/06/05 21:53


证书生成keyStore:
 keytool -import -v -file f:/ssl/clientkey.cer -keystore f:/ssl/tomcat.keystore

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.mail.internet.ParseException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.params.AuthParams;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.cookie.CookieSpec;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import sun.util.logging.resources.logging;

public class HttpsClientProcessor2 {
    private static final Logger log = Logger.getLogger(HttpsClientProcessor2.class);

    HttpClient hc = null;
   
    
    /**
     * 设置信任自签名证书
     *   
     * @param keyStorePath      密钥库路径
     * @param keyStorepass      密钥库密码
     * @return
     */  
    public static SSLContext custom(String keyStorePath, String keyStorepass){  
        SSLContext sc = null;  
        FileInputStream instream = null;  
        KeyStore trustStore = null;  
        try {  
            trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
            instream = new FileInputStream(new File(keyStorePath));  
            trustStore.load(instream, keyStorepass.toCharArray());  
            // 相信自己的CA和所有自签名的证书  
            sc = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();  
        } catch (KeyStoreException | NoSuchAlgorithmException| CertificateException | IOException | KeyManagementException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                instream.close();  
            } catch (IOException e) {  
            }  
        }  
        return sc;  
    }  
    
    
    //getRequest
    public static CloseableHttpResponse doHttpsGet(String url,String cookie,String refer) throws ClientProtocolException, IOException{
        String body = "";  
        
        //tomcat是我自己的密钥库的密码,你可以替换成自己的  
        //如果密码为空,则用"nopassword"代替  
        SSLContext sslcontext = custom("keystore路径", "密码"); 
         
           // 设置协议http和https对应的处理socket链接工厂的对象  
           Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()  
               .register("http", PlainConnectionSocketFactory.INSTANCE)  
               .register("https", new SSLConnectionSocketFactory(sslcontext))  
               .build();  
           PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  
           HttpClients.custom().setConnectionManager(connManager);  
      
           //创建自定义的httpclient对象  
           HttpHost proxy = new HttpHost("172.17.18.80",8080,"http");

        CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setProxy(proxy).build();  
         //  CloseableHttpClient client = HttpClients.createDefault();  
        HttpGet get = new HttpGet(url);
//        get.setHeader("Content-type", "application/x-www-form-urlencoded");  
//        get.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0");
        if(cookie != null){
            get.setHeader("Cookie",cookie);
        }
        if(refer != null){
            get.setHeader("Referer", refer);
        }
        CloseableHttpResponse response = client.execute(get);
        
        return response;
    }
    
    
    /**
     * 模拟请求
     *  
     * @param url       资源地址
     * @param map   参数列表
     * @param encoding  编码
     * @param referUrl
     * @param cookie1
     * @return
     * @throws ParseException
     * @throws IOException
     * @throws KeyManagementException  
     * @throws NoSuchAlgorithmException  
     * @throws ClientProtocolException  
     */  
    public static CloseableHttpResponse doHttpsPost(String url, Map<String,String> map,String encoding, String cookie1, String referUrl) throws ClientProtocolException, IOException {  
        String body = "";  
          
        //tomcat是我自己的密钥库的密码,你可以替换成自己的  
        //如果密码为空,则用"nopassword"代替  
        SSLContext sslcontext = custom("keystore路径", "密码");  
          
           // 设置协议http和https对应的处理socket链接工厂的对象  
           Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()  
               .register("http", PlainConnectionSocketFactory.INSTANCE)  
               .register("https", new SSLConnectionSocketFactory(sslcontext))  
               .build();  
           PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  
           HttpClients.custom().setConnectionManager(connManager);  
      
           //创建自定义的httpclient对象  
           HttpHost proxy = new HttpHost("172.17.18.80",8080,"http");

        CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setProxy(proxy).build();  
         //  CloseableHttpClient client = HttpClients.createDefault();  
          
        //创建post方式请求对象  
        HttpPost httpPost = new HttpPost(url);  
          
        //装填参数  
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
        if(map!=null){  
            for (Entry<String, String> entry : map.entrySet()) {  
                nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));  
            }  
        }  
        //设置参数到请求对象中  
        httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));  
      
        log.info("请求地址:"+url);  
        log.info("请求参数:"+nvps.toString());  
          
        //设置header信息  
        //指定报文头【Content-type】、【User-Agent】  
//        httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");  
//        httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
        if(cookie1 != null){
            httpPost.setHeader("Cookie", cookie1);
        }
        if(referUrl != null){
            httpPost.setHeader("Referer", referUrl);
        }
//        if(url.indexOf("CreateSealDetailReport") != -1 ){//https://scnewb2b.travelsky.com/scb2b/CreateSealDetailReport.do
//            httpPost.setHeader("X-Requested-With", "XMLHttpRequest");
//            httpPost.setHeader("Accept","*/*");
//        }
        
        //执行请求操作,并拿到结果(同步阻塞)  
        CloseableHttpResponse response = client.execute(httpPost);  
        //获取结果实体  
        return response;
    }  
    
}

原创粉丝点击