
原文来自:Protecting users with TLS by default in Android P
Android承诺去保持用户他们的设备和数据安全。保持数据安全之一的方式是,通过保护Android设备在进入或者离开中转传输层安全(TLS)的所有数据。正如我们在Android P开发者预览版中宣布的那样,我们将进一步改善这些保护,通过阻止目标版本是Android P的应用程序来自默认允许未加密的连接。
这是我们为保护Android用户,多年来做出的各种改变。去阻止偶发的未加密连接,在Android Marshmallow(6.0)中我们介绍了android:usesCleartextTraffic清单属性。在Android Nougat(7.0),我们通过创建Network Security Config(网络安全配置)功能特性去扩展了这个属性,允许应用程序去表明它们不打算在没有加密的情况下发送网络流量。在Android Nougat(7.0)和Android Oreo(8.0),我们仍然允许明文连接。
我怎么更新我的应用程序?
如果你的应用程序对于所有的连接都使用了TLS,然后你不需要做什么了。如果你还没有,就去使用TLS去加密所有的连接更新你的应用程序。如果你仍然需要去使用明文进行连接,继续去阅读一下最佳做法。
为什么我应该使用TLS?
Android考虑到所有的网络可能有敌意,因此加密流量应该在所有时间对于所有的连接都被使用。移动设备尤其面临风险,因为它们经常会连接到许多不同的网络,比如在咖啡店的Wi-Fi
所有的流量应该被加密,无论内容是什么。作为任意一种未加密的连接能够注入内容被使用,对于那些可能弱势的客户端代码增加攻击面,或者攻击用户。更多信息,看我们过去的博客文章和开发者高峰论坛
TLS是不是很慢?
不,它不是
我如何在我的应用程序中使用TLS ?
只要你的服务器支持TLS, 只需要在你的应用程序和服务器响应中把URLs 从http://改变成https:// 。你的HTTP栈处理TLS握手,无需其他更多操作。
如果你是自己制作的Socket,使用SSLSocketFactory去替代SocketFactory
要格外小心去正确使用作为SSLSocket的socket,它不会去验证主机。你的应用程序需要做的是它自己的主机验证。优选通过调用getDefaultHostnameVerifier()期望的主机名。进一步,谨防HostnameVerifier.verify()在发生异常时不会抛出错误,但是相反的會返回一个boolean的结果,你必须明确的检查。
我需要去使用一个明文去…
当你应该对所有连接使用TLS,可能你需要去使用一个明文流量针对于遗留原因。比如连接到一些服务器。因此,改变你的应用程序的网络安全配置,以允许这些连接。
我们包括了一组示例配置,更多帮助查看network security config文档。
允许明文连接到一个具体的域,你可以使用如下的配置作为一个向导:
1 | <network-security-config> |
允许连接到任意不安全的域
如果你的应用程序支持打开任意来自不安全URLs的内容,当支持明文连接到任意主机,你应该禁用明文连接到你自己的服务器。记住,对于这些通过
不安全连接接收到的数据你应该谨慎,它能够在传输的过程当中被篡改。
1 | <network-security-config> |
我应该怎么更新我的库?
如果你的库是直接创建安全/不安全的连接,确保它在打开任意明文连接之前通过检查isCleartextTrafficPermitted来尊重应用程序明文设置。
以上是对Android官网博客文章的翻译,如果不足,欢迎指正,谢谢