
我正在尝试为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上运行 – 如何调试?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)