代码之家  ›  专栏  ›  技术社区  ›  Ben Baron

如何在Android平台上启用SSL调试?

  •  17
  • Ben Baron  · 技术社区  · 14 年前

    有类似的设置吗 -D javax.net.debug=ssl 在Java桌面应用程序的命令行中,但对于Android?我试过通过 System.setProperty("javax.net.debug", "ssl"); 但那没用。

    如果没有方法启用此属性,是否至少有其他方法调试SSL连接的客户端?

    为了澄清,这里指的是原始SSL套接字(SSLSocket和SSLSocketFactory),而不是Apache库或任何其他网络库。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Ben Baron    13 年前

    在这一点上,似乎没有办法做到这一点。但无论如何,我们很快就会切换到Netty库,它内置了更详细的日志记录功能。

    所以(不是很好的)解决这个问题的方法不是使用SSLSocket,而是使用更好的网络库。

        2
  •  2
  •   sambatree    10 年前

    您可以编写一个TrustManager类来处理它。 例子:

    ClientConnectionManager cm = new BasicClientConnectionManager();
    cm.getSchemeRegistry().register(createHttpsScheme());
    DefaultHttpClient client = new DefaultHttpClient(cm);
    String url = "https://your domain/your url";
    HttpGet get = new HttpGet(url);
    HttpResponse resp = client.execute(get);
    
    etc..
    
    public static Scheme createHttpsScheme() {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, new TrustManager[] {
                    new TestTrustManager()
            }, new SecureRandom());
    
            SSLSocketFactory sf = new SSLSocketFactory(context);
            return new Scheme("https", 443, sf);
    }
    

    public class TestTrustManager implements X509TrustManager {
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    
           for (int i = 0; i < chain.length; ++i) {
            System.out.println(chain[i]);
           }
    
           decorated.checkServerTrusted(chain, authType);
      }
    }
    
        3
  •  0
  •   Vivek Iyer    14 年前

    如果您使用的是Apache HttpClient(通过导入jar文件),那么可以通过在Eclipse中设置环境变量来启用日志记录。如果使用Commons日志记录,日志将打印到控制台。但是,只有在模拟器中运行应用程序,而不是在设备上运行应用程序时,此操作才有效。不确定这是否有帮助。

    http://hc.apache.org/httpcomponents-client-ga/logging.html

        4
  •  0
  •   Phil    9 年前

    我发现一个有用的调试辅助工具是在X509KeyManager和X509TrustManager周围编写一个包装器,在记录结果的同时将调用委托给原始实现,例如:

            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(ks);
    
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(ks, null);
    
            TrustManager[] tms = WrapTrustManager.WrapArray(tmf.getTrustManagers());
            KeyManager[] kms = WrapKeyManager.WrapArray(kmf.getKeyManagers());
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(kms, tms, null);
    
            ....setSocketFactory(context.getSocketFactory());
    

    请注意,该接口使用空的KeyManager和TrustManager接口,您需要动态地将它们向上转换为X509KeyManager和X509TrustManager。