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

原文: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(
nullnew 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 (如何绕过证书验证))