原文拷貝自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源代碼一上傳新浪微博就丟失,只好發截圖)

