Android OkHttp TLS相互验证-客户端不';无法将证书发送到服务器

Android OkHttp TLS相互验证-客户端不';无法将证书发送到服务器,android,ssl,grpc,okhttp,tls1.2,Android,Ssl,Grpc,Okhttp,Tls1.2,我需要一些关于Android OkHttp客户端/服务器应用程序的帮助。问题如下:我的Android客户端似乎在收到证书请求后没有向服务器发送任何证书。 以下是我的Android代码: private static SSLContext getContext(InputStream keystoreInputStream){ SSLContext sslContext = null; try{ //========== try {

我需要一些关于Android OkHttp客户端/服务器应用程序的帮助。问题如下:我的Android客户端似乎在收到证书请求后没有向服务器发送任何证书。 以下是我的Android代码:

private static SSLContext getContext(InputStream keystoreInputStream){
    SSLContext sslContext = null;
    try{
        //==========
        try {
            // The keystore contains the CA cert and the Client cert
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            try {
                keyStore.load(keystoreInputStream, "MYPASS".toCharArray());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    ksIn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            sslContext = SSLContext.getInstance("TLS");
            String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
            tmf.init(keyStore);

            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");
            keyManagerFactory.init(keyStore, "MYPASS".toCharArray());
            sslContext.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //==========
    }catch (Exception e){

    }
    return sslContext;
}
这是Android客户端(192.168.1.72)和服务器(192.168.1.79)之间的wireshark会话:


如您所见,服务器发送证书请求,但客户端发送长度为0的证书。你能解释一下我该怎么解决这个问题吗?谢谢。

首先,使用类似URL的URL尝试现有设置。它应该打印出您发送的客户端证书

其次,您可以自己实现一个KeyManager,并查看发生了什么,即使它只是装饰了Android KeyManager并记录了调用


最后,您可以在JDK上进行比较。在这个场景中,您可以启用SSL日志来查看发生了什么,但不要期望JSSE和Android的Conscrypt提供程序之间有相同的行为。

我最终发现问题出在我的密钥库和信任库文件中,它们只是格式不正确。 我只是试着用这些简单的段落来重建它们:

  • 创建一个包含客户端证书和密钥的txt文件(只需复制并粘贴证书后的密钥)
  • 生成密钥库:
    openssl pkcs12-export-in-out.pkcs12-name,我把它放在这里,因为我发现它干净易懂。

    如果你测试,你会得到什么响应?刚刚解决,如果你想看看,我发布了一个响应,谢谢!