码迷,mamicode.com
首页 > 编程语言 > 详细

[转]java 关于httpclient 请求https (如何绕过证书验证)

时间:2015-04-13 16:18:05      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:

原文:http://www.blogjava.net/hector/archive/2012/10/23/390073.html

第一种方法,适用于httpclient4.X 里边有get和post两种方法供你发送请求使用。

导入证书发送请求的在这里就不说了,网上到处都是

技术分享import java.io.BufferedReader;
技术分享import java.io.IOException;
技术分享import java.io.InputStream;
技术分享import java.io.InputStreamReader;
技术分享import java.io.UnsupportedEncodingException;
技术分享import java.net.HttpURLConnection;
技术分享import java.net.InetAddress;
技术分享import java.net.InetSocketAddress;
技术分享import java.net.Socket;
技术分享import java.net.SocketAddress;
技术分享import java.net.URI;
技术分享import java.net.URISyntaxException;
技术分享import java.net.URL;
技术分享import java.net.URLConnection;
技术分享import java.net.URLEncoder;
技术分享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.HostnameVerifier;
技术分享import javax.net.ssl.HttpsURLConnection;
技术分享import javax.net.ssl.SSLContext;
技术分享import javax.net.ssl.SSLSession;
技术分享import javax.net.ssl.TrustManager;
技术分享import javax.net.ssl.X509TrustManager;
技术分享
技术分享
技术分享import org.apache.http.HttpEntity;
技术分享import org.apache.http.HttpResponse;
技术分享import org.apache.http.client.ClientProtocolException;
技术分享import org.apache.http.client.HttpClient;
技术分享import org.apache.http.client.methods.HttpGet;
技术分享import org.apache.http.client.methods.HttpPost;
技术分享import org.apache.http.conn.ClientConnectionManager;
技术分享import org.apache.http.conn.ConnectTimeoutException;
技术分享import org.apache.http.conn.scheme.HostNameResolver;
技术分享import org.apache.http.conn.scheme.Scheme;
技术分享import org.apache.http.conn.scheme.SchemeRegistry;
技术分享import org.apache.http.conn.ssl.SSLSocketFactory;
技术分享import org.apache.http.entity.StringEntity;
技术分享import org.apache.http.impl.client.DefaultHttpClient;
技术分享import org.apache.http.params.HttpConnectionParams;
技术分享import org.apache.http.protocol.HTTP;
技术分享import org.apache.http.util.EntityUtils;
技术分享
技术分享
技术分享/*
技术分享 * 技术分享 * 
技术分享 */
技术分享public class HttpClientSendPost {
技术分享private static DefaultHttpClient client;
技术分享 /** 
技术分享     * 访问https的网站 
技术分享     * @param httpclient 
技术分享     */  
技术分享    private static void enableSSL(DefaultHttpClient httpclient){  
技术分享        //调用ssl  
技术分享         try {  
技术分享                SSLContext sslcontext = SSLContext.getInstance("TLS");  
技术分享                sslcontext.init(null, new TrustManager[] { truseAllManager }, null);  
技术分享                SSLSocketFactory sf = new SSLSocketFactory(sslcontext);  
技术分享                sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
技术分享                Scheme https = new Scheme("https", sf, 443);  
技术分享                httpclient.getConnectionManager().getSchemeRegistry().register(https);  
技术分享            } catch (Exception e) {  
技术分享                e.printStackTrace();  
技术分享            }  
技术分享    }  
技术分享    /** 
技术分享     * 重写验证方法,取消检测ssl 
技术分享     */  
技术分享    private static TrustManager truseAllManager = new X509TrustManager(){  
技术分享  
技术分享        public void checkClientTrusted(  
技术分享                java.security.cert.X509Certificate[] arg0, String arg1)  
技术分享                throws CertificateException {  
技术分享            // TODO Auto-generated method stub  
技术分享              
技术分享        }  
技术分享  
技术分享        public void checkServerTrusted(  
技术分享                java.security.cert.X509Certificate[] arg0, String arg1)  
技术分享                throws CertificateException {  
技术分享            // TODO Auto-generated method stub  
技术分享              
技术分享        }  
技术分享  
技术分享        public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
技术分享            // TODO Auto-generated method stub  
技术分享            return null;  
技术分享        }  
技术分享          
技术分享    }; 
技术分享/**
技术分享* HTTP Client Object,used HttpClient Class before(version 3.x),but now the
技术分享* HttpClient is an interface
技术分享*/
技术分享
技术分享
技术分享public static String sendXMLDataByGet(String url,String xml){
技术分享   // 创建HttpClient实例     
技术分享        if (client == null) {
技术分享// Create HttpClient Object
技术分享client = new DefaultHttpClient();
技术分享enableSSL(client);
技术分享}
技术分享        StringBuilder urlString=new StringBuilder();
技术分享        urlString.append(url);
技术分享        urlString.append("?");
技术分享        System.out.println("getUTF8XMLString(xml):"+getUTF8XMLString(xml));
技术分享        try {
技术分享urlString.append(URLEncoder.encode( getUTF8XMLString(xml) , "UTF-8" ));
技术分享} catch (UnsupportedEncodingException e2) {
技术分享// TODO Auto-generated catch block
技术分享e2.printStackTrace();
技术分享}
技术分享        String urlReq=urlString.toString();
技术分享        // 创建Get方法实例     
技术分享        HttpGet httpsgets = new HttpGet(urlReq);
技术分享
技术分享        String strRep="";
技术分享try {
技术分享HttpResponse response = client.execute(httpsgets);    
技术分享HttpEntity entity = response.getEntity(); 
技术分享
技术分享if (entity != null) 
技术分享strRep = EntityUtils.toString(response.getEntity());
技术分享   // Do not need the rest    
技术分享   httpsgets.abort();    
技术分享}
技术分享} catch (ClientProtocolException e) {
技术分享// TODO Auto-generated catch block
技术分享e.printStackTrace();
技术分享} catch (IllegalStateException e) {
技术分享// TODO Auto-generated catch block
技术分享e.printStackTrace();
技术分享} catch (IOException e) {
技术分享// TODO Auto-generated catch block
技术分享e.printStackTrace();
技术分享}  
技术分享        return strRep;
技术分享    } 
技术分享
技术分享
技术分享/**
技术分享* Send a XML-Formed string to HTTP Server by post method
技术分享
技术分享* @param url
技术分享*            the request URL string
技术分享* @param xmlData
技术分享*            XML-Formed string ,will not check whether this string is
技术分享*            XML-Formed or not
技术分享* @return the HTTP response status code ,like 200 represents OK,404 not
技术分享*         found
技术分享* @throws IOException
技术分享* @throws ClientProtocolException
技术分享*/
技术分享public static String sendXMLDataByPost(String url, String xmlData)
技术分享throws ClientProtocolException, IOException {
技术分享if (client == null) {
技术分享// Create HttpClient Object
技术分享client = new DefaultHttpClient();
技术分享enableSSL(client);
技术分享}
技术分享client.getParams().setParameter("http.protocol.content-charset",
技术分享HTTP.UTF_8);
技术分享client.getParams().setParameter(HTTP.CONTENT_ENCODING, HTTP.UTF_8);
技术分享client.getParams().setParameter(HTTP.CHARSET_PARAM, HTTP.UTF_8);
技术分享client.getParams().setParameter(HTTP.DEFAULT_PROTOCOL_CHARSET,
技术分享HTTP.UTF_8);
技术分享
技术分享// System.out.println(HTTP.UTF_8);
技术分享// Send data by post method in HTTP protocol,use HttpPost instead of
技术分享// PostMethod which was occurred in former version
技术分享// System.out.println(url);
技术分享HttpPost post = new HttpPost(url);
技术分享post.getParams().setParameter("http.protocol.content-charset",
技术分享HTTP.UTF_8);
技术分享post.getParams().setParameter(HTTP.CONTENT_ENCODING, HTTP.UTF_8);
技术分享post.getParams().setParameter(HTTP.CHARSET_PARAM, HTTP.UTF_8);
技术分享post.getParams()
技术分享.setParameter(HTTP.DEFAULT_PROTOCOL_CHARSET, HTTP.UTF_8);
技术分享
技术分享
技术分享// Construct a string entity
技术分享StringEntity entity = new StringEntity(getUTF8XMLString(xmlData), "UTF-8");
技术分享entity.setContentType("text/xml;charset=UTF-8");
技术分享entity.setContentEncoding("UTF-8");
技术分享// Set XML entity
技术分享post.setEntity(entity);
技术分享// Set content type of request header
技术分享post.setHeader("Content-Type", "text/xml;charset=UTF-8");
技术分享// Execute request and get the response
技术分享HttpResponse response = client.execute(post);
技术分享HttpEntity entityRep = response.getEntity(); 
技术分享String strrep="";
技术分享        if (entityRep != null) {     
技术分享            strrep = EntityUtils.toString(response.getEntity());
技术分享            // Do not need the rest    
技术分享            post.abort();    
技术分享        }  
技术分享// Response Header - StatusLine - status code
技术分享// statusCode = response.getStatusLine().getStatusCode();
技术分享return strrep;
技术分享}
技术分享/**
技术分享* Get XML String of utf-8
技术分享
技术分享* @return XML-Formed string
技术分享*/
技术分享public static String getUTF8XMLString(String xml) {
技术分享// A StringBuffer Object
技术分享StringBuffer sb = new StringBuffer();
技术分享sb.append(xml);
技术分享String xmString = "";
技术分享try {
技术分享xmString = new String(sb.toString().getBytes("UTF-8"));
技术分享} catch (UnsupportedEncodingException e) {
技术分享// TODO Auto-generated catch block
技术分享e.printStackTrace();
技术分享}
技术分享// return to String Formed
技术分享return xmString.toString();
技术分享}
技术分享}

第二种仿http的不用HttpClient 都是jdk自带的包

技术分享package org.sp.sc.util;
技术分享
技术分享
技术分享import java.io.ByteArrayOutputStream;
技术分享import java.io.InputStream;
技术分享import java.net.URL;
技术分享import java.security.cert.CertificateException;
技术分享import java.security.cert.X509Certificate;
技术分享
技术分享
技术分享import javax.net.ssl.HostnameVerifier;
技术分享import javax.net.ssl.HttpsURLConnection;
技术分享import javax.net.ssl.SSLContext;
技术分享import javax.net.ssl.SSLSession;
技术分享import javax.net.ssl.SSLSocketFactory;
技术分享import javax.net.ssl.TrustManager;
技术分享import javax.net.ssl.X509TrustManager;
技术分享
技术分享
技术分享   /**
技术分享     * 无视Https证书是否正确的Java Http Client
技术分享     * 
技术分享     * 
技术分享     * @author huangxuebin
技术分享     *
技术分享     * @create 2012.8.17
技术分享     * @version 1.0
技术分享     */
技术分享public class HttpsUtil {
技术分享
技术分享
技术分享    /**
技术分享     * 忽视证书HostName
技术分享     */
技术分享    private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
技术分享        public boolean verify(String s, SSLSession sslsession) {
技术分享            System.out.println("WARNING: Hostname is not matched for cert.");
技术分享            return true;
技术分享        }
技术分享    }
技术分享
技术分享     /**
技术分享     * Ignore Certification
技术分享     */
技术分享    private static TrustManager ignoreCertificationTrustManger = new X509TrustManager() {
技术分享
技术分享技术分享        private X509Certificate[] certificates;
技术分享技术分享
技术分享        @Override
技术分享        public void checkClientTrusted(X509Certificate certificates[],
技术分享                String authType) throws CertificateException {
技术分享            if (this.certificates == null) {
技术分享                this.certificates = certificates;
技术分享                System.out.println("init at checkClientTrusted");
技术分享            }
技术分享        }
技术分享
技术分享
技术分享        @Override
技术分享        public void checkServerTrusted(X509Certificate[] ax509certificate,
技术分享                String s) throws CertificateException {
技术分享            if (this.certificates == null) {
技术分享                this.certificates = ax509certificate;
技术分享                System.out.println("init at checkServerTrusted");
技术分享            }技术分享
技术分享//            for (int c = 0; c < certificates.length; c++) {
技术分享//                X509Certificate cert = certificates[c];
技术分享//                System.out.println(" Server certificate " + (c + 1) + ":");
技术分享//                System.out.println("  Subject DN: " + cert.getSubjectDN());
技术分享//                System.out.println("  Signature Algorithm: "
技术分享//                        + cert.getSigAlgName());
技术分享//                System.out.println("  Valid from: " + cert.getNotBefore());
技术分享//                System.out.println("  Valid until: " + cert.getNotAfter());
技术分享//                System.out.println("  Issuer: " + cert.getIssuerDN());
技术分享//            }
技术分享技术分享
技术分享        }
技术分享
技术分享
技术分享        @Override
技术分享        public X509Certificate[] getAcceptedIssuers() {
技术分享            // TODO Auto-generated method stub
技术分享            return null;
技术分享        }
技术分享技术分享    };
技术分享
技术分享
技术分享    public static String getMethod(String urlString) {
技术分享
技术分享技术分享        ByteArrayOutputStream buffer = new ByteArrayOutputStream(512);
技术分享        try {
技术分享技术分享            URL url = new URL(urlString);
技术分享技术分享            /*
技术分享             * use ignore host name verifier
技术分享             */
技术分享            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
技术分享            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
技术分享
技术分享
技术分享            // Prepare SSL Context
技术分享            TrustManager[] tm = { ignoreCertificationTrustManger };
技术分享            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
技术分享            sslContext.init(null, tm, new java.security.SecureRandom());
技术分享
技术分享
技术分享            // 从上述SSLContext对象中得到SSLSocketFactory对象
技术分享            SSLSocketFactory ssf = sslContext.getSocketFactory();
技术分享            connection.setSSLSocketFactory(ssf);
技术分享            
技术分享            InputStream reader = connection.getInputStream();
技术分享            byte[] bytes = new byte[512];
技术分享            int length = reader.read(bytes);
技术分享
技术分享
技术分享            do {
技术分享                buffer.write(bytes, 0, length);
技术分享                length = reader.read(bytes);
技术分享            } while (length > 0);
技术分享
技术分享
技术分享            // result.setResponseData(bytes);
技术分享            System.out.println(buffer.toString());
技术分享            reader.close();
技术分享            
技术分享            connection.disconnect();
技术分享        } catch (Exception ex) {
技术分享            ex.printStackTrace();
技术分享        } finally {
技术分享        }
技术分享        String repString= new String (buffer.toByteArray());
技术分享        return repString;
技术分享    }
技术分享
技术分享
技术分享//    public static void main(String[] args) {
技术分享//        String urlString = "https://218.202.0.241:8081/XMLReceiver";
技术分享//        String output = new String(HttpsUtil.getMethod(urlString));
技术分享//        System.out.println(output);
技术分享//    }
技术分享}

[转]java 关于httpclient 请求https (如何绕过证书验证)

标签:

原文地址:http://www.cnblogs.com/skrifer/p/4422043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!