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

2022-09-03 02:59:13

对于 Java 桌面应用程序,是否有类似于命令行设置的内容,但对于 Android?我尝试过在代码中设置它,但这不起作用。-D javax.net.debug=sslSystem.setProperty("javax.net.debug", "ssl");

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

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


答案 1

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

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


答案 2

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