客户端证书无法在Android上运行 – 如何调试?

客户端证书无法在Android上运行 – 如何调试?,第1张

概述我正在尝试为Android应用程序实现客户端证书通信,到目前为止没有太大的成功–而且似乎这个功能,如果可能的话,非常难.我正在实现的完整流程在mypreviousquestion中描述.我按照那里的代码和thisblogpost的代码,描述相同的场景,或多或少,没有结果.什么不起作用:在Android客户

我正在尝试为Android应用程序实现客户端证书通信,到目前为止没有太大的成功 – 而且似乎这个功能,如果可能的话,非常难.我正在实现的完整流程在my previous question中描述.

我按照那里的代码和this blog post的代码,描述相同的场景,或多或少,没有结果.

什么不起作用:在AndroID客户端和服务器之间打开SSL连接(httpsURLConnection)会导致服务器返回403 status code.
AFAIK,这403是因为服务器没有或不信任它获得的客户端证书,我不知道如何调试它.

什么工作:

>创建PKCS#10请求,将其发送到CA并获取已签名的PKCS#7(P7B)
>使用私钥将收到的P7B存储在KeyStore中,并将其导出到PKCS#12(P12)
>(最多的是)从设备中挑选P12,将其安装在windows上,联系服务器并获得连贯的(200 http-OK)响应.

我改变了什么:从我得到的代码示例(从here和here开始),我不得不改变一些事情.我正在使用httpsURLConnection而不是OkhttpClIEnt,因为@Than在那里使用(但它应该没关系),我不能像Rich Freedman那样提供证书(他有证书,我通过PKCS#10获得它) #7),所以我创建了一个信任服务器证书的CustomTrustManager,因此我使用spongycastle(v1.5.0.0如果重要,设置为0时插入的提供者)并且也不保留证书,但都是在内存中完成的.

问题是接下来该做什么:

>我如何判断服务器的期望(客户端证书明智)?
>如何判断哪些客户端证书(如果有)被发送到服务器?
>一般如何调试此场景? (像fiddler这样的代理对底层SSL没用)

谢谢!

解决方法:

这不是一个好的答案,但是在这里发布它作为评论太多了.

对于日志记录,调试,您可以创建自己的X509KeyManager,它使用从KeyManagerFactory获得的普通密钥管理器:

@DeBUGLog注释来自杰克沃顿创建的雨果图书馆.它打印函数参数及其返回的内容.您可以使用普通的Log.d或任何您想要的.

例如:

class MyKeyManager implements X509KeyManager {    private final X509KeyManager keyManager;    MyKeyManager(X509KeyManager keyManager) {        this.keyManager = keyManager;    }    @DeBUGLog    @OverrIDe    public String chooseClIEntAlias(String[] strings, Principal[] principals, Socket socket) {        return this.keyManager.chooseClIEntAlias(strings, principals, socket);    }    @DeBUGLog    @OverrIDe    public String chooseServerAlias(String s, Principal[] principals, Socket socket) {        return keyManager.chooseServerAlias(s, principals, socket);    }    @DeBUGLog    @OverrIDe    public X509Certificate[] getCertificateChain(String s) {        return keyManager.getCertificateChain(s);    }    @DeBUGLog    @OverrIDe    public String[] getClIEntAliases(String s, Principal[] principals) {        return keyManager.getClIEntAliases(s, principals);    }    @DeBUGLog    @OverrIDe    public String[] getServerAliases(String s, Principal[] principals) {        return keyManager.getServerAliases(s, principals);    }    @DeBUGLog    @OverrIDe    public PrivateKey getPrivateKey(String s) {        return keyManager.getPrivateKey(s);    }}

并使用它来初始化SSLContext

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(keyStore, password);final X509KeyManager origKm = (X509KeyManager) kmf.getKeyManagers()[0];X509KeyManager km = new MyKeyManager(origKm);SSLContext sslCtx = SSLContext.getInstance("TLS");sslCtx.init(new KeyManager[]{km}, tmf.getTrustManagers(), null);

您将看到调用哪个方法,参数是什么(从服务器证书获得)以及您的keymanager返回的证书和私钥.

总结

以上是内存溢出为你收集整理的客户端证书无法在Android上运行 – 如何调试?全部内容,希望文章能够帮你解决客户端证书无法在Android上运行 – 如何调试?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1099795.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存