我想对XMPP搜索“接受未知的证书”,在Android的警告。我从here得到了代码。它工作正常,我可以连接到服务器。但其表示这样避免同时使用XMPP
警告窗口,如果我点击“总是”或“一旦”被接受,我能够显示联系人和聊天消息....
有什么办法可以阻止这种警报,并且可以直接连接到服务器吗?由MemorizingTrustManager(MTM),一个Android库旨在改善安全性/易用性权衡“私有云” SSL装置显示
我想对XMPP搜索“接受未知的证书”,在Android的警告。我从here得到了代码。它工作正常,我可以连接到服务器。但其表示这样避免同时使用XMPP
警告窗口,如果我点击“总是”或“一旦”被接受,我能够显示联系人和聊天消息....
有什么办法可以阻止这种警报,并且可以直接连接到服务器吗?由MemorizingTrustManager(MTM),一个Android库旨在改善安全性/易用性权衡“私有云” SSL装置显示
此消息。每当你不是由Android操作系统的一个颁发的证书连接到服务器
MTM问题,此警告信任的根CA,就像一个CACERT自签名证书或一个。
如果消息再次出现,你点击“总是”后,这是MTM(可能是由于不匹配的SSL服务器名称)的错误,并应通过GitHub的报告。
编辑:如果你正在一个应用程序,只用一台服务器进行通信,你知道服务器的提前证书,则应更换MTM与AndroidPinning,从而确保没有人可以让中间人中间人攻击你的连接。
免责声明:我是MTM的作者和yaxim的mainainer。
获取由证书颁发机构签署的证书。忘记所有编码解决方案。
“获取由证书颁发机构签名的证书” - 这并不真正有用,因为CA不保证任何有用内容。实质上,您向没有担保且不承担任何责任的产品支付某人的费用。省钱并使用自签名证书。自签名证书提供同等安全性。这里真正的问题是安全用户界面。授予,纯文本HTTP - 良好;具有自签名(机会加密)的HTTPS - 不好;来自CA的HTTPS没有保修 - 很好。纯文本何时比机会加密更好? – jww
@noloader垃圾。自签名证书不等同于CA签名证书。一方面,他们激发了成千上万的这样的问题,最终导致各种可疑和不安全的“解决方案”。 CA签名表示,证书中表示的身份由发放证书的人拥有,并且已通过某个离线流程进行检查。你似乎不知道它的第一件事。如果你想在CA行业发脾气,这个答案不是做这件事的地方。你最后的两句话仅仅是不合逻辑的。 – EJP
“一方面它们激发了成千上万个这样的问题” - 这就是破损的用户界面,而不是自签名证书。 “ – jww
有什么办法可以阻止这个警报,并且我可以直接连接到服务器吗?
对我来说,如果你写这个应用程序连接到kluebook.com,我不清楚。我认为你做到了,但并不明确。
假设您编写了应用程序并知道要连接的服务器(kluebook.com),您应该提供自定义的TrustManager
来处理此问题。您可以在OWASP's Certificate and Public Key Pinning示例中找到与预期服务器证书配合使用的自定义TrustManger
的代码。它可以固定,因为你知道证书或公钥是什么,并且不需要相信像CA这样的其他人。
如果您没有先验的知识,那么您首先使用并相信一个关键的连续性策略,寻找证书或公钥的突然变化。在这种情况下,首次使用的信任应包括习惯性的X509检查。
固定是整体安全多元化策略的一部分。关于这个问题的一本很好的书是Peter Gutmann的Engineering Security。
您所看到的提示是战略的一个方面 - 即首先使用信托(TOFU)战略。该提示具有边际价值,因为用户不知道如何回复它,所以他们只需点击yes即可解除该框,以便他们可以继续他们正在做的事情。 Peter Gutmann在Engineering Security中有关用户心理学的很好的文章(完成安全UI研究)。
从部分OWASP's Certificate and Public Key Pinning 6.1:
public final class PubKeyManager implements X509TrustManager
{
private static String PUB_KEY = "30820122300d06092a864886f70d0101...";
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
{
if (chain == null) {
throw new IllegalArgumentException("checkServerTrusted: X509Certificate array is null");
}
if (!(chain.length > 0)) {
throw new IllegalArgumentException("checkServerTrusted: X509Certificate is empty");
}
if (!(null != authType && authType.equalsIgnoreCase("RSA"))) {
throw new CertificateException("checkServerTrusted: AuthType is not RSA");
}
// Perform customary SSL/TLS checks
try {
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init((KeyStore) null);
for (TrustManager trustManager : tmf.getTrustManagers()) {
((X509TrustManager) trustManager).checkServerTrusted(chain, authType);
}
} catch (Exception e) {
throw new CertificateException(e);
}
// Hack ahead: BigInteger and toString(). We know a DER encoded Public Key begins
// with 0x30 (ASN.1 SEQUENCE and CONSTRUCTED), so there is no leading 0x00 to drop.
RSAPublicKey pubkey = (RSAPublicKey) chain[0].getPublicKey();
String encoded = new BigInteger(1 /* positive */, pubkey.getEncoded()).toString(16);
// Pin it!
final boolean expected = PUB_KEY.equalsIgnoreCase(encoded);
if (!expected) {
throw new CertificateException("checkServerTrusted: Expected public key: "
+ PUB_KEY + ", got public key:" + encoded);
}
}
}
}
你可以从OpenSSL的s_client
预期的公钥,但你必须知道的端口。我无法从著名的SSL端口像5223的响应,和5222没有任何的安全服务:
$ openssl s_client -connect kluebook.com:5222
CONNECTED(00000003)
140735088755164:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:766:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 322 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
一旦你得到一个公钥,在PUB_KEY
插回TrustManager
。
如果您自己编译应用程序,则可以添加旨在抑制此警告的众多技巧之一。警告:StackOverflow上的大多数解决方案将完全消除SSL提供的所有安全性。无论您是否想维护一些安全性,诀窍在于安装一个定制的证书管理器。 –
@ClassStacker可以随时获得定制的证书。或者我应该在代码中实施/修改它。 – sarabu
这是一个自定义证书_manager_。是的,在StackOverflow上可以找到工作代码片段。正如我所说,他们中的大多数将完全破坏SSL安全。您需要了解您的要求,以便根据您的需求选择最佳解决方案。 –