哦明智而高尚的甲骨文,
我正在将SSL添加到我在Android手机上编写的TCP客户端。我可以 成功连接到具有正确签名证书的服务器,我可以 通过编写TrustManager实现来连接到自我认证的主机 总觉得一切都很好。
我现在有一个装饰器TrustManager捕获证书(之前 委托给它的decoratee)自我认证的主机并提供给他们 我的气喘吁吁,但我无法解决的是如何实施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都关于远程服务器的公钥。
由于该网站是自我认证的,我想可能只是验证 公钥在一个简单的TrustManager中匹配,但我想了解 如何“应该”完成 - 从每个连接添加一个CA,因为 我不会相信那个CA。
答案 0 :(得分:0)
您需要在pre-ICS版本上使用自己的信任存储,并在第一次出错时将serer的证书添加到其中。后续连接将从信任存储加载它,从而信任远程证书。这不是一个完整的解决方案,但这是一种方法(Github上的代码),以及一些讨论:
http://nelenkov.blogspot.jp/2011/12/using-custom-certificate-trust-store-on.html