原标题:Protecting users with TLS by default in Android P
链接:https://android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html
作者:Chad Brubaker (Android安全高级软件工程师)
翻译:arjinmc
Android致力于保护用户,他们的设备和他们的数据安全。我们保持数据安全的一种方式是保护所有进入或离开安装有传输层安全(TLS)的Android设备的数据。正如我们在Android P开发者预览版中所宣布的,我们正在通过阻止针对Android P的应用默认允许未加密连接来进一步改进这些保护。
这是我们多年来为了更好地保护Android用户所做的各种更改。为了防止意外的未加密连接,我们在Android Marshmallow中引入了manifest属性android:usesCleartextTraffic。在Android Nougat中,我们通过创建Network Security Config功能扩展了该属性,该功能允许应用程序指示他们不打算在没有加密的情况下发送网络传送。在Android Nougat和Oreo中,我们仍然允许明文连接。
如果你的应用程序使用TLS进行所有连接,那么你无需做任何事。如果没有,请更新你的应用以使用TLS加密所有连接。如果你仍然需要建立明文连接,请继续阅读以获得一些最佳实践。
Android认为所有网络都可能是敌对的,因此应该始终使用加密传送来处理所有连接。移动设备尤其面临风险,因为他们经常连接到许多不同的网络,例如咖啡店的Wi-Fi。
无论内容如何,所有传送均应加密,因为任何未加密的连接可用于注入内容,增加可能存在漏洞的客户端代码的攻击面,或跟踪用户。有关更多信息,请参阅我们过去的博客文章和Developer Summit talk。
一旦你的服务器支持TLS,只需将你的应用中的URL和服务器响应从http://更改为https://。你的HTTP堆栈无需任何工作即可处理TLS握手。
如果你要自己创建socket,请使用SSLSocketFactory而不是SocketFactory。请特别注意正确使用sockets,因为SSLSocket不执行主机名验证。你的应用程序需要进行自己的主机名验证,最好通过getDefaultHostnameVerifier()预期的主机名进行调用。此外,请注意,HostnameVerifier.verify()不会在错误时抛出异常,而是返回必须明确检查的boolean结果。
虽然你应该对所有连接使用TLS,但可能出于遗留原因需要使用明文传送,例如连接到某些服务器。为此,请更改你应用的网络安全配置以允许这些连接。
我们已经包含了几个示例配置。请参阅网络安全配置文档获取更多帮助。
如果你需要允许连接到特定域或一组域,可以使用以下指南配置:
<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>
如果你的lib直接创建安全/不安全的连接,请 在打开任何明文连接之前检查[isCleartextTrafficPermitted](https://developer.android.com/reference/android/security/NetworkSecurityPolicy.html#isCleartextTrafficPermitted(java.lang.String),确保它符合应用程序的明文设置。