gpt4 book ai didi

java - 对于我的应用程序的 SSL 使用,我如何影响 'known_hosts' 与 self 认证的服务器?

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:41 24 4
gpt4 key购买 nike

哦,聪明而高贵的甲骨文,

我正在将 SSL 添加到我在 Android 手机上编写的 TCP 客户端。我可以成功连接到具有正确签名证书的服务器,我可以通过编写 TrustManager 实现连接到自认证主机总是认为一切都很好。

我现在有一个装饰器 TrustManager 捕获证书(之前委派给它的装饰者)用于 self 认证的主机并将它们呈现给我气喘吁吁的细读,但我无法解决的是如何实现 ssh警告主机未知并主动记住它的行为下次 - 并这样做。

我假设我需要的只是存储公钥——就像 ssh 一样known_hosts - 并重新表示它,但使用此代码和“sslTrust”持有公钥:

TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null); // initialise!
ks.setKeyEntry("dbentry", Base64.decode(sslTrust, Base64.NO_WRAP), null);
tmf.init(ks);
tms = tmf.getTrustManagers();
ss.stm = new SnoopyTrustManager((X509TrustManager) tms[0]);
// ...
SLContext context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] { ss.stm } , null);
ss.factory = context.getSocketFactory();
// ...
SocketFactory factory = ss.getFactory();
mSocket = factory.createSocket(host, port);

尝试建立连接结果

SSLHandshakeException: InvalidAlgorithmParameterException: trustAnchors.isEmpty()

这很公平:我不知道如何根据证书来编造东西由远程服务器提供。我也很确定这不是我告诉TrustManager 关于远程服务器的公钥。

由于该网站是 self 认证的,我想可能只是验证一下公钥在一个普通的 TrustManager 中匹配,但我想了解这“应该”是如何完成的——在每个连接的基础上添加一个 CA,因为我不会因为任何其他事情而信任那个 CA。

最佳答案

您需要在 ICS 之前的版本上使用您自己的信任库,并在第一次出错时将服务器的证书添加到其中。后续连接将从信任库加载它,从而信任远程证书。这不是一个完整的解决方案,但这是一种实现方法(Github 上的代码)以及一些讨论:

http://nelenkov.blogspot.jp/2011/12/using-custom-certificate-trust-store-on.html

关于java - 对于我的应用程序的 SSL 使用,我如何影响 'known_hosts' 与 self 认证的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9920896/

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