接受自签名证书是否安全?

D.W*_*.W. 0 security ssl android certificate

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

我正在考虑配置Android TrustManager以接受自签名证书,或接受所有证书,以便我可以调试我的应用程序.我在这个网站上阅读了一些关于如何做到这一点的资源.这样做安全吗?

D.W*_*.W. 7

不,这不安全.它破坏了SSL/TLS的大部分安全优势.它使您的应用程序对中间人攻击开放.接受所有自签名证书几乎与不使用SSL一样糟糕.

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

该怎么做

有一些合理的候选替代方案.

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

或者,另一个合理的选择是将您自己的自签名证书添加到证书存储区,以便它可以被信任.Android让这比必要的更痛苦; 您需要做的是实现TrustManager引用自定义的自定义TrustStore.该自定义TrustStore将包括您的自签名证书.TrustManager如果证书与自签名证书匹配,或者如果它通过了所有常规证书验证检查,则自定义将接受证书.您可以在此博客文章本教程中找到有关如何执行操作的详细信息.

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

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

如果您的应用程序是为连接到单个特定服务器而编写的,则可以选择使用证书固定来获得更好的安全性.这基本上意味着您只接受由单个选定的证书颁发机构(CA)签名的证书,而不是由Android信任的任何数十个CA签署的证书.您可以在本教程中找到有关如何执行操作的详细信息,或使用Moxie Marlinspike的库(请阅读此处的介绍)或此博客文章.

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

这真的很重要吗?

真的有关系吗?是的,它可能会.

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

引文: