為父母生,為老婆死,為程序奮斗一輩子,吃眼前虧,上公司的當,最后死在客戶的需求上

          Hector_封嘴

          華子說:看破紅塵,與程序為伴!
          posts - 4, comments - 1, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          關于httpclient 請求https (如何繞過證書驗證)

          Posted on 2012-10-23 07:26 赫赫 閱讀(17447) 評論(1)  編輯  收藏 所屬分類: HttpClient
          第一種方法,適用于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);
          //    }
          }




           


          評論

          # re: 關于httpclient 請求https (如何繞過證書驗證)  回復  更多評論   

          2014-05-05 18:26 by zuidaima
          可以參考代碼:java apache commons HttpClient發送get和post請求的學習整理,下載地址:http://www.zuidaima.com/share/1754065983409152.htm

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          用兩年的工作經驗,從零開始,重新開始做一個稱職的程序員!
          主站蜘蛛池模板: 金华市| 连州市| 大丰市| 怀集县| 宽甸| 湖南省| 淮南市| 康马县| 阳东县| 阿拉尔市| 嘉鱼县| 乌兰察布市| 称多县| 临澧县| 澄江县| 定西市| 黄骅市| 桓台县| 友谊县| 罗源县| 辰溪县| 南岸区| 苗栗市| 化隆| 大化| 南华县| 盐山县| 华宁县| 缙云县| 巴林右旗| 浙江省| 万源市| 宿州市| 岱山县| 封开县| 瓦房店市| 浦北县| 灵璧县| 沾化县| 兴义市| 涞水县|