在Android P中默认使用TLS保护用户

备注: Android P 即 Android 9.0,文中保持原文翻译

Android致力于保证其用户、设备和数据的安全。我们保证数据安全的一种方式是通过保护所有进入或离开使用TLS技术的Android设备数据。正如我们在Android P开发人员预览版中所宣布的那样,我们通过默认阻止Android P应用使用未加密连接通信来进一步提升安全性。

这是我们多年来为保护Android用户所做的各种更改。为了防止意外的未加密连接,我们在Android Marshmallow(安卓6.0)中引入了android:usesCleartextTraffic 这样一个manifest属性。在Android Nougat(安卓7.0)中,我们通过创建网络安全配置(Network Security Config)功能扩展了该属性,该功能允许应用程序警告开发者在没有加密的情况下发送网络流量。在Android Nougat(安卓7.0)和Oreo(安卓8.0)中,我们仍然允许明文连接。

如何更新我的应用程序?

如果你的应用程序使用TLS进行所有连接通信,那么你无须改变。如果不是,请使用TLS加密技术更新你的应用。如果你仍然需要建立明文连接,请继续阅读,下文有解决方案。

为什么要使用TLS?

Android认为所有网络都可能是不安全的,因此应该始终使用加密流量来处理所有的连接。移动设备尤其面临风险,因为他们经常连接到许多不同的网络,例如咖啡店的Wi-Fi。

无论通信内容的重要性如何,所有流量均应加密,因为任何未加密的连接可被劫持并注入恶意内容,增加了可能存在漏洞的客户端代码攻击面,也可能被用来跟踪用户。有关更多信息,请参阅我们之前的博客文章开发者论坛社区

TLS不是很慢吗?

不,并不慢。《Istlsfastyet》

如何在我的应用程序中使用TLS?

一旦你的服务器支持TLS,只需将你的应用中的URL和服务器响应从http://更改为https://即可。你的HTTP 代码无需额外的改变即可处理TLS握手。

如果你使用自己创建的套接字(socket),请使用SSLSocketFactory,而不是SocketFactory。请特别注意正确地使用套接字,因为SSLSocket不会执行主机名验证。你的应用程序需要自行处理主机名验证,最好通过调用getDefaultHostnameVerifier()函数执行预期的主机名验证。此外,请注意,HostnameVerifier.verify()不会在错误时抛出异常,而是会返回必须明确检查的布尔结果。

我需要使用明文流量…

虽然你应该对所有连接使用TLS,但可能出于历史遗留原因需要使用明文流量,例如连接到某些服务器。为此,请更改你应用的网络安全配置。

我们已经完成了几个示例配置。请参阅网络安全配置文档获取更多帮助(network security config)。

允许明文通信连接到特定的域

如果你需要允许连接到特定域或一组域,可以使用以下配置示例:

<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
        <domain includeSubdomains="true">insecure.cdn.example.com</domain>
    </domain-config>
</network-security-config>

允许连接到任意不安全的域

如果你的应用支持通过不安全连接的URL打开任意内容,则应该禁用链接到自己服务器的明文连接,但同时支持与其他任意主机的明文连接。请记住,对于通过不安全连接收到的数据应该保持谨慎,因为它可能在传输过程中被篡改。

<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">example.com</domain>
        <domain includeSubdomains="true">cdn.example2.com</domain>
    </domain-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

如何更新你的库?

如果你的库直接创建安全/不安全的连接,请在打开任何明文连接之前检查isCleartextTrafficPermitted字段以确保它符合应用程序的明文设置。