1. 程式人生 > >從頭學習爬蟲(八)進階篇----https

從頭學習爬蟲(八)進階篇----https

本文主要講解https。

首先要提到ssl證書,看看網路解釋。

什麼是 SSL 證書? SSL 證書就是遵守 SSL 安全套接層協議的伺服器數字證書。而 SSL 安全協議最初是由美國網景 Netscape Communication 公司設計開發的,全稱為:安全套接層協議 (Secure Sockets Layer) , 它指定了在應用程式協議 ( 如 HTTP 、 Telnet 、 FTP) 和 TCP/IP 之間提供資料安全性分層的機制,它是在傳輸通訊協議 (TCP/IP) 上實現的一種安全協議,採用公開金鑰技術,它為 TCP/IP 連線提供資料加密、伺服器認證、訊息完整性以及可選的客戶機認證。由於此協議很好地解決了網際網路明文傳輸的不安全問題,很快得到了業界的支援,並已經成為國際標準。

SSL 證書由瀏覽器中“受信任的根證書頒發機構”在驗證伺服器身份後頒發,具有網站身份驗證和加密傳輸雙重功能。

在請求https程式碼裡經常報的錯都是ssl,苦惱了了半天。

我總結兩條

1繞過

2配置

主要看下程式碼實現吧

摘自網路:

  1. /** 
  2.  * 繞過驗證 
  3.  *   
  4.  * @return 
  5.  * @throws NoSuchAlgorithmException  
  6.  * @throws KeyManagementException  
  7.  */
  8. publicstatic SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {  
  9.     SSLContext sc = SSLContext.getInstance("SSLv3");  
  10.     // 實現一個X509TrustManager介面,用於繞過驗證,不用修改裡面的方法
  11.     X509TrustManager trustManager = new X509TrustManager() {  
  12.         @Override
  13.         publicvoid checkClientTrusted(  
  14.                 java.security.cert.X509Certificate[] paramArrayOfX509Certificate,  
  15.                 String paramString) throws
     CertificateException {  
  16.         }  
  17.         @Override
  18.         publicvoid checkServerTrusted(  
  19.                 java.security.cert.X509Certificate[] paramArrayOfX509Certificate,  
  20.                 String paramString) throws CertificateException {  
  21.         }  
  22.         @Override
  23.         public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
  24.             returnnull;  
  25.         }  
  26.     };  
  27.     sc.init(nullnew TrustManager[] { trustManager }, null);  
  28.     return sc;  
  29. }  
  1. /** 
  2.  * 模擬請求 
  3.  *  
  4.  * @param url       資源地址 
  5.  * @param map   引數列表 
  6.  * @param encoding  編碼 
  7.  * @return 
  8.  * @throws NoSuchAlgorithmException  
  9.  * @throws KeyManagementException  
  10.  * @throws IOException  
  11.  * @throws ClientProtocolException  
  12.  */
  13. publicstatic String send(String url, Map<String,String> map,String encoding) throws KeyManagementException, NoSuchAlgorithmException, ClientProtocolException, IOException {  
  14.     String body = "";  
  15.     //採用繞過驗證的方式處理https請求
  16.     SSLContext sslcontext = createIgnoreVerifySSL();  
  17.        // 設定協議http和https對應的處理socket連結工廠的物件
  18.        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()  
  19.            .register("http", PlainConnectionSocketFactory.INSTANCE)  
  20.            .register("https"new SSLConnectionSocketFactory(sslcontext))  
  21.            .build();  
  22.        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  
  23.        HttpClients.custom().setConnectionManager(connManager);  
  24.        //建立自定義的httpclient物件
  25.     CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();  
  26. /       CloseableHttpClient client = HttpClients.createDefault();  
  27.     //建立post方式請求物件
  28.     HttpPost httpPost = new HttpPost(url);  
  29.     //裝填引數
  30.     List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
  31.     if(map!=null){  
  32.         for (Entry<String, String> entry : map.entrySet()) {  
  33.             nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));  
  34.         }  
  35.     }  
  36.     //設定引數到請求物件中
  37.     httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));  
  38.     System.out.println("請求地址:"+url);  
  39.     System.out.println("請求引數:"+nvps.toString());  
  40.     //設定header資訊
  41.     //指定報文頭【Content-type】、【User-Agent】
  42.     httpPost.setHeader("Content-type""application/x-www-form-urlencoded");  
  43.     httpPost.setHeader("User-Agent""Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
  44.     //執行請求操作,並拿到結果(同步阻塞)
  45.     CloseableHttpResponse response = client.execute(httpPost);  
  46.     //獲取結果實體
  47.     HttpEntity entity = response.getEntity();  
  48.     if (entity != null) {  
  49.         //按指定編碼轉換結果實體為String型別
  50.         body = EntityUtils.toString(entity, encoding);  
  51.     }  
  52.     EntityUtils.consume(entity);  
  53.     //釋放連結
  54.     response.close();  
  55.        return body;  
  56. }  
配置證書這邊不再寫了,有需要自行百度。