zoukankan      html  css  js  c++  java
  • 如何抓取基于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源代码一上传新浪微博就丢失,只好发截图)

  • 相关阅读:
    Android中Handler与Message的简单实例
    折腾蛋疼的Ubuntu1204LTS的U盘安装
    sgs_intro
    把杀某程序封装成sh
    boost 程序库完全开发_ch4_utility
    VS2005 warning C4819处理办法(提示代码页有不兼容的字符)
    Ubuntu1204LTS下xynxyc编译Emacs24.02
    当VS05调试赋值不对时,小心只是IDE的watch在骗你.....
    很好的boost学习资料
    C++实现Creational Singleton模式
  • 原文地址:https://www.cnblogs.com/xzjf/p/8249905.html
Copyright © 2011-2022 走看看