繁体   English   中英

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

[英]How to enable SSL debugging on the Android platform?

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

如果没有办法启用此属性,是否至少有另一种方法来调试SSL连接的客户端?

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

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

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

因此,针对此问题的(不是很好的)解决方案就是不使用SSLSocket,而是使用更好的网络库。

我发现一个有用的调试帮助是在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());

WrapTrustManager和WrapKeyManager的实现非常简单,但是他们使用异常来指示失败,因此在记录结果时不要吞下异常很重要。

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

如果您正在使用Apache HttpClient(通过导入jar文件),则可以通过在Eclipse中设置环境变量来启用日志记录。 如果使用Commons Logging,日志将打印到控制台。 但是,这仅适用于您在模拟器中而不是在设备上运行应用程序的情况。 不确定这有帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM