gpt4 book ai didi

android - 客户端证书不适用于 Android - 如何调试?

转载 作者:行者123 更新时间:2023-11-29 16:01:20 25 4
gpt4 key购买 nike

我正在尝试为 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)响应。<

我所做的更改:根据我获得的代码示例(来自 herehere ),我必须更改一些内容。我使用的是 HttpsURLConnection,而不是 OkHttpClient,因为 @Than 在那里使用(但这不重要),我不能像 Rich Freedman 那样提供证书(他证书,我是通过 PKCS#10 和 #7 获得它),所以我创建了一个信任服务器证书的 CustomTrustManager,因此我使用 SpongyCaSTLe(v1.5.0.0 如果重要,设置为在 0 处插入的提供者)并且也不保留证书,但所有操作都在内存中完成。

问题是接下来要做什么:

  • 我如何知道服务器期望什么(客户端证书方面)?
  • 我如何知道哪些客户端证书(如果有)被发送到服务器?
  • 一般如何调试这种情况? (Fiddler等代理对底层SSL没用)

谢谢!

最佳答案

这不是很好的答案,但这里有太多内容无法作为评论发布。

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

@DebugLog 注释来自 Jake Wharton 创建的 Hugo 库。它打印函数参数及其返回的内容。您可以使用普通的 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);

您将看到调用了哪个方法、参数是什么(从服务器证书获得)以及 key 管理器返回的证书和私钥。

关于android - 客户端证书不适用于 Android - 如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24476591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com