我有一个Android应用,当我尝试将自己的服务器与我自己的自签名证书一起使用时,我不断获得javax.net.ssl.SSLException: Not trusted server certificate
。
我正在考虑将Android TrustManager
配置为接受自签名证书,或接受所有证书,以便我可以调试我的应用。我在这个网站上看到了一堆关于如何做到这一点的resources。这样做安全吗?
答案 0 :(得分:7)
不,这不安全。它破坏了SSL / TLS的大部分安全优势。它会让您的应用对man-in-the-middle attacks开放。接受所有自签名证书几乎与不使用SSL一样糟糕。
不要这样做。请勿修改默认策略以接受所有证书或所有自签名证书,或禁用主机名验证检查。
有一些合理的候选替代方案。
一个合理的选择是为开发人员调试引入配置选项。如果启用此选项,则可以禁用证书验证;如果禁用,则使用标准证书验证检查。默认应该是禁用它。此外,请确保该选项只能在启用了开发者设置且已在Google开发者帐户中注册的设备上启用,以防止普通用户无意中破坏自己的安全性。
或者,另一个合理的选择是将您自己的自签名证书添加到证书存储区,以便它可信任。 Android让这比必要的更痛苦;您需要做的是实现引用自定义TrustManager
的自定义TrustStore
。自定义TrustStore
将包含您的自签名证书。如果自定义TrustManager
与自签名证书匹配,或者如果它通过了所有常规证书验证检查,则自定义{{1}}将接受该证书。您可以在this blog post和this tutorial上找到有关如何执行此操作的详细信息。
其中任何一个都可以让您在本地进行测试和调试,并确保您在测试和生产中运行相同的代码。它还可以避免不安全的测试代码泄漏到生产环境中并危及用户安全的风险。
如果您的应用程序是为连接到单个特定服务器而编写的,则可以选择使用证书固定来获得更好的安全性。这基本上意味着您只接受由单个选定的证书颁发机构(CA)签名的证书,而不是由Android信任的任何数十个CA签署的证书。您可以找到有关如何执行此操作的详细信息at this tutorial,或使用Moxie Marlinspike's library(阅读his introduction here)或this blog post。
然而,这可以说是次要的。最重要的是通过接受所有证书(或所有自签名证书)来避免禁用标准证书验证检查。
真的重要吗?是的,它可能会。
研究表明,由于禁用部分或全部认证验证检查,许多应用程序都存在严重的安全漏洞 - 可能有15%的应用受到影响。在许多情况下,攻击者可能会窃听SSL流量,他们也可以发起中间人攻击:例如,如果您的应用中的某个用户通过开放的Wifi网络连接,那么范围内的任何人都可以对该用户进行中间人攻击(不仅仅是窃听)。值得避开此漏洞。
引用:
答案 1 :(得分:1)
您可以要求TrustManager接受您自己的自签名证书。
Here有两种方法分别返回DefaultHttpClient
和HttpsURLConnection
,同时接受自签名证书作为参数。您可以复制和通过代码或调整TrustManager的部分。
答案 2 :(得分:0)
如果您考虑不使用默认信任管理器,您应该在http://www.theregister.co.uk/2012/10/21/android_app_ssl_vulnerability/之前阅读。引用:
...发现他们样本中17%的使用SSL的应用程序遭受的实施可能使他们容易受到中间人MITM攻击的攻击。</ p>