如何在Android平台上启用SSLdebugging?

有没有类似的设置-D javax.net.debug=ssl在Java桌面应用程序的命令行,但为Android? 我已经尝试通过System.setProperty("javax.net.debug", "ssl");在代码中设置它System.setProperty("javax.net.debug", "ssl"); 但是这并没有奏效。

如果没有办法启用这个属性,至less有另一种方法来debuggingSSL连接的客户端?

编辑:只是为了澄清,这是指原始SSL套接字(SSLSocket和SSLSocketFactory),而不是Apache库或任何其他networking库。

Solutions Collecting From Web of "如何在Android平台上启用SSLdebugging?"

在这一点上,似乎没有办法做到这一点。 但无论如何,我们正在切换到Netty库,这个库有更详细的日志loggingfunction。

所以这个(不是很好)的解决scheme就是不使用SSLSocket,而是使用更好的networking库。

你可以写一个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); } 

int TestTrustManager.java你可以打印这样的链:

 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); } } 

如果您使用Apache HttpClient(通过导入jar文件),则可以通过在Eclipse中设置环境variables来启用日志logging。 如果使用Commons Logging,日志将打印到控制台。 但是,只有在模拟器中而不是在设备上运行应用程序的情况下,这才有效。 不知道这有助于。

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

我发现一个有用的debugging手段是编写一个X509KeyManager和X509TrustManager的包装器,它将日志logging结果中的调用委托给原始实现,例如:

  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()); 

WrapTrustManager和WrapKeyManager的实现非常简单,但要警告他们使用exception来指示失败,所以在logging结果时不要吞下exception是很重要的。

请注意,接口使用空的KeyManager和TrustManager接口,您需要将这些接口dynamic上传到X509KeyManager和X509TrustManager。