Conscrypt

借助 Conscrypt 模块,无需依赖于 OTA 更新,即可加速实现安全改进并提高设备安全性。它使用 Java 代码和原生库来提供 Android TLS 实现以及大部分 Android 加密功能(例如密钥生成器、加密算法和消息摘要)。Conscrypt 以开源库的形式提供,但包含在 Android 平台中时有一些特殊化。

Conscrypt 模块使用 BoringSSL,后者是 Google 在 OpenSSL 基础上派生出的一个原生库,在很多 Google 产品(最值得注意的是 Google Chrome)中和 Conscrypt 代码(Java 代码和原生代码)一起用于加密和传输层安全协议 (TLS)。BoringSSL 没有正式版本(所有用户都需要从头构建),并且无法保证 API 或 ABI 的稳定性。

Android 15 中的更改

Android 15 限制了 TLS 版本 1.0 和 1.1 的使用。这些版本之前在 Android 中已废弃,现在已禁止面向 Android 15 的应用使用。

Android 14 中的变化

Android 14 在 Conscrypt 中引入了可更新的根受信任证书存储区。CA 证书为 Android 和整个互联网中使用的公钥提供信任根。我们会定期检查这些证书,以确保加密签名正确无误,因此必须提供这些证书,并将其存储在所有依赖于它们的设备上。

在 Mainline 之前,Android 将证书存储在系统分区 (system/ca-certificates),并针对每个 Android 版本更新这些证书。现在,借助 Mainline,可以使用 Mainline 模块序列更新更频繁地更新证书。此新功能应该可以简化更新流程,让我们能够更快地解决问题,并有助于延长设备使用寿命。

从 Android 14 开始,根信任证书存储在 Conscrypt 模块 APEX 和系统分区中。应用仍可以选择自己的证书,并可以使用 NetworkSecurityConfig 修改证书行为。

Android 14 还包含以下其他 Conscrypt 模块变更:

  • 添加了 AES-CMAC MAC 实现。
  • 废弃并移除了“PBEwithHmacSHA2-*”MAC 实现。
  • 添加了对 X25519 密钥、密钥协议和签名的有限支持。
  • 更新了 BoringSSL,以确保 X.509 正确性。
  • 在公共 CertPath API 中取消了对 MD5 签名证书的支持。自 API 级别 16 以来,TLS 连接一直不支持此类证书。

Android 10 中的变化

Android 9 不包含 Android 特有的公共 Conscrypt API,而是使用一种安全提供程序。该安全提供程序可为 Java 加密架构 (JCA)(包括加密算法和消息摘要)和 Java 安全套接字扩展 (JSSE)(包括 SLSocket 和 SSLEngine)实现标准类。 用户与这些类进行互动,libcore 或框架代码会使用一些非公共 Conscrypt API。

Android 10 在 android.net.ssl 中添加了少量公共 API 方法,以访问 javax.net.ssl 下的类未提供的 Conscrypt 功能。此外,Android 10 还包含精简版的 Bouncy Castle,后者作为 Android 运行时的一部分提供不太热门的加密工具(未包含在 Conscrypt 模块中)。

格式和依赖项

Conscrypt 模块 (com.android.conscrypt) 以 APEX 文件的形式分发,该文件包含 Conscrypt Java 代码以及一个动态链接到 Android NDK 库(如 liblog)的 Conscrypt 原生库。该原生库还包含一个已通过 NIST 的加密模块验证计划 (CMVP) 进行验证(证书 #3753)的 BoringSSL 副本。

Conscrypt 模块公开以下 API:

  • 公共 APIjava.*javax.* 下软件包中的类和接口以及 android.net.ssl.* 下的类的扩展。外部应用代码无法直接调用 Conscrypt。平台 API 标准确保这些 API 保持向后和向前兼容性。
  • 核心平台 API 是框架访问非公开功能时使用的隐藏 API。这些 API 相对有限;最大的使用者是 NetworkSecurityConfig,它扩展 Conscrypt 信任管理器(用于验证证书的组件)来实现网络安全配置功能
  • 核心内 API 仅限于由 JCA 和 JSEE 机制以反射方式调用的零参数构造函数。