19

在 Android 7 Nougat 中,用户安装的证书转到“用户凭据”而不是“受信任的凭据”(由系统凭据和用户凭据组成)。

我曾经通过以下方式访问“受信任的凭据”:

KeyStore keystore = KeyStore.getInstance("AndroidCAStore");

通过上面的代码,我可以访问系统和用户信任的凭据。

但是现在,在 Android 7 中,用户安装的证书会转到Settings --> Security --> User credentials.

我的问题是如何以编程方式列出User credentialsAndroid 7 中的凭据?

4

2 回答 2

9

为了在整个 Android 生态系统中提供更一致和更安全的体验,从 Android Nougat 开始,兼容设备仅信任AOSPCAs中维护的标准化系统。

以前,pre-installed CAs与系统捆绑的集合可能因设备而异。当某些设备不包含应用程序连接所需的CA时,这可能会导致兼容性问题;如果某些设备上包含不符合我们安全要求的CA ,则可能会导致潜在的安全问题。

首先,确保您的 CA 需要包含在系统中。预装的 CA 仅适用于满足我们安全要求的 CA,因为它们会影响设备上大多数应用程序的安全连接。如果您需要添加一个 CA 来连接到使用该 CA 的主机,您应该改为自定义连接到这些主机的应用程序和服务。有关自定义可信 CA的更多信息。

在上面的链接中,您可以找到信任具有不同需求的自定义 CA 的所有必要信息,例如

  1. 信任自定义 CA 进行调试
  2. 信任域的自定义 CA
  3. 为某些域信任用户添加的 CA
  4. 为所有域信任用户添加的 CA,除了某些域
  5. 为所有安全连接信任用户添加的 CA

因此,基本上您需要添加一个安全配置文件配置一个自定义 CA(对于 Android 7.0(API 级别 24)及更高版本)。

在你的manifest.xml

<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

res/xml/network_security_config.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

仅供参考:- 如果您运行您认为应该包含在 Android 中的 CA,请首先完成Mozilla CA 包含流程,然后针对 Android 提交功能请求,以将该 CA 添加到标准化的系统 CA 集中。

让我知道任何进一步的帮助。

希望这会帮助你。继续编码!!!

于 2016-11-22T13:44:38.533 回答
5

除了更改如何配置 Ca(@Pravin D 答案),Android 已将 pkcs12 证书的加载方式从 6 更改为 7。我强调了重要元素:

导入 pkcs12 时,是否将根 CA 导入为受信任的?

  • 安卓 6:是的
  • 安卓 7:没有

我在哪里可以看到受信任的凭据?

  • Android 6:(Settings ---> Security-->Trusted credentials系统和用户)
  • Android 7:(Settings ---> Security-->Trusted credentials系统和用户选项卡)

如何安装用户凭据?

  • Android 6:pkcs#12 文件,证书文件,以编程方式
  • Android 7:pkcs#12 文件(无私钥)、证书文件、以编程方式、自定义 CA 配置(@ Pravin D 答案)

我在哪里可以看到用户凭据(私钥)?

  • Android 6:在设置中不可用
  • 安卓 7:Settings-->Security-->User credentials

是否可以以编程方式列出用户凭据?

  • 安卓 6:没有
  • 安卓 7:没有

深入审查 Android 代码,内部 Android Keystore 被故意隐藏,仅可从 Android 核心类中使用。无法实施解决方法来列出用户凭据

于 2016-12-14T22:13:01.777 回答