【问题标题】:Is it safe to accept self-signed certificates?接受自签名证书是否安全?
【发布时间】:2014-05-29 00:10:07
【问题描述】:

我有一个 Android 应用程序,当我尝试将它与我自己的服务器和我自己的自签名证书一起使用时,我不断收到javax.net.ssl.SSLException: Not trusted server certificate

我正在考虑将 Android TrustManager 配置为接受自签名证书或接受所有证书,以便调试我的应用程序。我在这个网站上阅读了一堆resources 来了解如何做到这一点。这样做安全吗?

【问题讨论】:

    标签: android security ssl certificate


    【解决方案1】:

    不,这不安全。它破坏了 SSL/TLS 的大部分安全优势。它使您的应用程序对man-in-the-middle attacks 开放。接受所有自签名证书几乎和不使用 SSL 一样糟糕。

    不要这样做。请勿修改默认策略以接受所有证书或所有自签名证书,或禁用主机名验证检查。

    该怎么做

    有一些候选方案是合理的。

    一个合理的选择是为开发人员调试引入一个配置选项。如果启用此选项,您可以禁用证书验证;如果它被禁用,则使用标准证书验证检查。默认应该是禁用它。此外,请确保该选项只能在启用了开发者设置且已注册 Google 开发者帐户的设备上启用,以防止普通用户无意中破坏自己的安全。

    另外,另一种合理的选择是将您自己的自签名证书添加到证书存储中,以便它受到信任。 Android 使这比必要的更痛苦。您需要做的是实现您自己的自定义TrustManager,它引用自定义TrustStore。自定义 TrustStore 将包含您的自签名证书。如果自定义 TrustManager 与该自签名证书匹配,或者如果它通过所有常规证书验证检查,则自定义 TrustManager 将接受该证书。您可以在 this blog postthis tutorial 上找到有关如何执行此操作的详细信息。

    其中任何一个都可以让您在本地进行测试和调试,并确保您在测试和生产中运行相同的代码。它还将避免不安全的测试代码泄漏到生产环境中并危及用户安全的风险。

    我可以获得更好的安全性吗?

    如果您的应用是为连接到单个特定服务器而编写的,您可以选择通过使用证书固定来获得更好的安全性。这基本上意味着您将只接受由一个选定的证书颁发机构 (CA) 签名的证书,而不是由 Android 信任的数十个 CA 中的任何一个签名的证书。你可以在at this tutorial,或使用Moxie Marlinspike's library(阅读his introduction here),或this blog post找到详细信息。

    但是,这可以说是次要的。最重要的是通过接受所有证书(或所有自签名证书)来避免禁用标准证书验证检查。

    真的很重要吗?

    真的很重要吗?是的,应该是的。

    研究发现,由于禁用了部分或全部认证验证检查,许多应用存在严重的安全漏洞——可能有 15% 的应用受到影响。在攻击者可能能够窃听 SSL 流量的许多情况下,他们还可以发起中间人攻击:例如,如果您的应用程序的一个用户通过开放的 Wifi 网络连接,那么范围内的任何人都可以对该用户进行中间人攻击(不仅仅是窃听)。避免此漏洞是值得的。

    引用:

    【讨论】:

    【解决方案2】:

    您可以要求 TrustManager 接受您自己的自签名证书。 Here 有 2 个方法分别返回 DefaultHttpClientHttpsURLConnection,也接受自签名证书作为参数。您可以复制并粘贴代码或调整 TrustManager 的一部分。

    【讨论】:

      【解决方案3】:

      如果您想不使用默认信任管理器,您可能应该在http://www.theregister.co.uk/2012/10/21/android_app_ssl_vulnerability/ 之前阅读。只是引用:

      ...发现样本中 17% 的使用 SSL 的应用遭受了可能使它们容易受到中间人 MITM 攻击的实施。

      【讨论】:

        猜你喜欢
        • 2012-07-02
        • 2017-12-18
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-18
        • 2021-05-21
        • 1970-01-01
        相关资源
        最近更新 更多