2013-12-12 101 views
3

我想对XMPP搜索“接受未知的证书”,在Android的警告。我从here得到了代码。它工作正常,我可以连接到服务器。但其表示这样避免同时使用XMPP

Warning for connection

警告窗口,如果我点击“总是”或“一旦”被接受,我能够显示联系人和聊天消息....

有什么办法可以阻止这种警报,并且可以直接连接到服务器吗?由MemorizingTrustManager(MTM),一个Android库旨在改善安全性/易用性权衡“私有云” SSL装置显示

+0

如果您自己编译应用程序,则可以添加旨在抑制此警告的众多技巧之一。警告:StackOverflow上的大多数解决方案将完全消除SSL提供的所有安全性。无论您是否想维护一些安全性,诀窍在于安装一个定制的证书管理器。 –

+1

@ClassStacker可以随时获得定制的证书。或者我应该在代码中实施/修改它。 – sarabu

+0

这是一个自定义证书_manager_。是的,在StackOverflow上可以找到工作代码片段。正如我所说,他们中的大多数将完全破坏SSL安全。您需要了解您的要求,以便根据您的需求选择最佳解决方案。 –

回答

9

此消息。每当你不是由Android操作系统的一个颁发的证书连接到服务器

MTM问题,此警告信任的根CA,就像一个CACERT自签名证书或一个。

如果消息再次出现,你点击“总是”后,这是MTM(可能是由于不匹配的SSL服务器名称)的错误,并应通过GitHub的报告。

编辑:如果你正在一个应用程序,只用一台服务器进行通信,你知道服务器的提前证书,则应更换MTM与AndroidPinning,从而确保没有人可以让中间人中间人攻击你的连接。

免责声明:我是MTM的作者和yaxim的mainainer。

3

获取由证书颁发机构签署的证书。忘记所有编码解决方案。

+0

“获取由证书颁发机构签名的证书” - 这并不真正有用,因为CA不保证任何有用内容。实质上,您向没有担保且不承担任何责任的产品支付某人的费用。省钱并使用自签名证书。自签名证书提供同等安全性。这里真正的问题是安全用户界面。授予,纯文本HTTP - 良好;具有自签名(机会加密)的HTTPS - 不好;来自CA的HTTPS没有保修 - 很好。纯文本何时比机会加密更好? – jww

+0

@noloader垃圾。自签名证书不等同于CA签名证书。一方面,他们激发了成千上万的这样的问题,最终导致各种可疑和不安全的“解决方案”。 CA签名表示,证书中表示的身份由发放证书的人拥有,并且已通过某个离线流程进行检查。你似乎不知道它的第一件事。如果你想在CA行业发脾气,这个答案不是做这件事的地方。你最后的两句话仅仅是不合逻辑的。 – EJP

+0

“一方面它们激发了成千上万个这样的问题” - 这就是破损的用户界面,而不是自签名证书。 “ – jww

2

有什么办法可以阻止这个警报,并且我可以直接连接到服务器吗?

对我来说,如果你写这个应用程序连接到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