Conscrypt 模块加速了安全改进,并在不依赖 OTA 更新的情况下提高了设备安全性。它使用 Java 代码和一个原生库来提供 Android TLS 实现以及大部分 Android 加密功能,例如密钥生成器、密码和消息摘要。Conscrypt 以 开源库 的形式提供,但在包含在 Android 平台中时,它有一些特殊之处。
Conscrypt 模块使用 BoringSSL,这是一个原生库,它是 Google 的 OpenSSL 分支,在许多 Google 产品中用于加密和 TLS(最值得注意的是 Google Chrome),并结合 Conscrypt 代码(包括 Java 和原生代码)。BoringSSL 没有正式版本(所有用户都从 head 构建),并且不保证 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 不包含 Conscrypt 的 Android 特定公共 API,而是使用安全提供程序,该提供程序实现了 Java Cryptography Architecture (JCA) 的标准类(包括 Cipher 和 MessageDigest)以及 Java Secure Socket Extension (JSSE) 的标准类(包括 SSLSocket 和 SSLEngine)。用户与这些类交互,并且 libcore
或框架代码使用了一些非公共 Conscrypt API。
Android 10 在 android.net.ssl
中添加了少量公共 API 方法,用于访问 javax.net.ssl
下的类未公开的 Conscrypt 功能。Android 10 还包含 Bouncy Castle 的精简副本,以提供作为 Android Runtime 一部分的较低流行度的加密工具(不包含在 Conscrypt 模块中)。
格式和依赖项
Conscrypt 模块(com.android.conscrypt
)以 APEX 文件的形式分发,该文件包含 Conscrypt Java 代码和一个 Conscrypt 原生库,该库动态链接到 Android NDK 库(例如 liblog
)。原生库还包含 BoringSSL 的副本,该副本已通过 NIST 的 加密模块验证计划 (CMVP) 进行了验证(证书 #3753)。
Conscrypt 模块公开了以下 API
- 公共 API 是
java.*
和javax.*
下包以及android.net.ssl.*
下类中类和接口的扩展。外部应用代码不直接调用 Conscrypt。平台 API 标准确保这些 API 保持向后和向前兼容。 - 核心平台 API 是框架用于访问非公共功能的隐藏 API。这些 API 相对有限;最大的用户是
NetworkSecurityConfig
,它扩展了 Conscrypt 信任管理器(验证证书的组件)以实现 网络安全配置功能。 - 核心内 API 仅限于 JCA 和 JSEE 机制反射调用的零参数构造函数。