如何抓取基於https協議的webservice數據包


方法一:基於Fiddler2等第三方工具(需要在Java端禁用SSL安全檢查)

     原文拷貝自http://blog.csdn.net/zmxj/article/details/6327775,向原作者表示敬意

     最近在寫一個客戶端訪問客戶提供的webservice時,得到響應異常,於是想用工具抓取請求響應的soap數據查找異常原因,如果service是http發布的,用一般的http、tcp監控工具都可以抓到發送數據的原文,但是我請求的service是https發布的,使用一般的較底層的網絡抓包工具抓到的都是經過加密的數據。搜索了很多相關文章最后找到了抓取解密后https明文的方法。

     我的前題是我使用java寫的一段客戶端代碼請求一個基於https發布的webservice,我的客戶端代碼工具自動生成的基於JAX-WS的客戶端代碼。思路是這樣的,我們需要找到一個基於proxy的http抓包工具並且他支持https抓包解碼。然后在客戶端代碼中設置代理的ip和端口號然后發送請求就可以利用工具抓到解密后的原文。 我找了一些工具,像apache的tcpMon只能抓到加密過的數據。membrane-monitor感覺界面做的不錯,但是貌似對https的代理支持不太完全,像smsniff這樣的也是太底層,只能抓到密文。最后發現兩個工具可以支持抓到解密后的數據,就是Fiddler2和paros兩個都是開源的免費軟件。Fiddler2是個不錯的工具,安裝后他會自動代理ie和firefox等瀏覽器請求,基本無需設置,默認代理端口是8888.要抓取https數據,需要設置https解密功能打開即可。具體可參考這篇文章在服務器上用Fiddler抓取HTTPS流量 ,paros是個相當簡單的軟件,安裝好后只要設置個代理地址和端口就可以了,默認就支持代理和解密https。設置好代理后,該如何使用客戶端代碼調用呢,首先在調用客戶端的代碼前我們需要在system property中設置如下代理的配置項:

System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");

光這樣代碼執行還是會得到異常提示需要證書,客戶端發送https請求是需要證書信息的,出於調試目的我們可以在客戶端代碼中設置忽略ssl認證,(這里我們提供一個證書到制定一個路徑應該也是可以的,具體參考java net相關api)這樣就可以正常發送請求了,請求成功后,可以看到fidder2中抓到了請求的數據。忽略ssl認證的代碼如下:

// The following tells Java to ignore certificate problems
  TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
   public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    return null;
   }
   public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
   }
   public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
   }
  } };
  try {
   SSLContext context = SSLContext.getInstance("TLS");
   context.init(null, trustAllCerts, new java.security.SecureRandom());
   HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
  } catch (Exception e) {
  }
  // This tells Java to not worry about hostnames matching
  HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
   public boolean verify(String string, SSLSession ssls) {
    return true;
   }
  });

另外可參考http://www.ioncannon.net/programming/1280/using-a-http-proxy-to-debug-jax-ws-and-soap-over-https/

 

方法二:查看Log4J的log

發送Https請求的Java類庫都用到了Apache HttpServer。我們只要打開Log4j的相應開關,就可以在Java Console中看到Https發送和接收的報文。

具體方法為:將以下兩個文件復制到$JAVA_MAVEN_PROJECT/src/main/resources文件夾下,然后正常執行程序就可以了(如果該項目已經定義有log4j.propertes或log4j.xml,需要將兩個配置文件合並,具體參考Log4j文檔)

log4j.xml(NND,XML源代碼一上傳新浪微博就丟失,只好發截圖)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM