列出存储在用户凭据中的证书

20

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

我过去访问“受信任的凭据”的方法为:

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

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

但是在Android 7中,用户安装的证书被放置在一个称为“用户凭据”的独立位置下,即设置-->安全-->用户凭据

我的问题是如何以编程方式列出Android 7中用户凭据内的凭据?


阅读文档,我会认为如果通过<trust-anchors>进行配置(就像对于AP23及以下的应用程序自动完成的那样),则应用程序具有对用户证书的隐式访问权限。我没有读到任何关于明确访问用户凭据存储的方法。 - Robert
1
我在<trust-anchors>中添加了<certificates src="user"/>,但是我的应用程序仍然不信任位于“用户凭据”下的证书。 - Mellon
我认为你可能误解了“设置-->安全-->用户凭据”。它显示的是用户安装的证书和私钥,而不是可信证书。Android6可以管理用户证书,但在设置中无法看到它们,只有根CA。当您安装PKCS#12时,私钥可以在KeyChain中访问,并且根CA可以作为用户受信凭据安装在“AndroidCAStore”中。AndroidCAStore包含用户和系统条目,这就是您在Android 6和7中看到的内容。如果您正在寻找列出私钥(用户凭据内容)的方法,则没有API可以做到。 - pedrofb
如果别名中包含“user”字符串,则匹配,如果是,则可以将其列为用户添加的凭据。 - Tushar Bapte
你找到任何答案了吗? - Neeraj Goel
显示剩余6条评论
2个回答

11

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

以前,系统捆绑的预安装CAs集合因设备而异。这可能会导致兼容性问题,当一些设备未包含应用程序需要的CAs时,也可能存在潜在的安全问题,如果某些设备上包含未满足我们安全要求的CAs

首先,请确保您的CA需要包含在系统中。预安装的CAs仅适用于符合我们安全要求的CAs,因为它们会影响设备上大多数应用程序的安全连接。如果您需要添加CA以连接使用该CA的主机,则应自定义连接到这些主机的应用程序和服务。有关自定义受信任的CAs的详细信息,请参见。

在上面的链接中,您可以找到所有需要信任自定义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>

仅供参考 :- 如果您运营的CA应该包含在Android中,请先完成Mozilla CA Inclusion Process,然后针对Android提交一个feature request,以便将CA添加到标准化的系统CA集合中。

如需进一步帮助,请告知。

希望这能帮到您。继续编码吧!


两个问题:1.对于我的应用程序,我需要安装自己的根证书来信任Android 7中的存储。您是说Mozilla CA Inclusion Process是必须完成的过程,以便使我的根证书被Android 7信任吗? - Mellon
<domain includeSubdomains="true">example.com</domain>是什么意思?我需要放置它吗?这个子域名是什么?我的意思是,我知道我需要安装根证书到信任存储中,但是我从哪里获取子域名呢? - Mellon
Mozilla的CA包含过程并不是必须的,只有当您希望将您的CA列入Android 7.0及以上版本的受信任凭据列表时才需要。 - Pravin Divraniya
我仍然想问一下Mozilla CA的包含过程。所以,正如你所说,“仅当您想要将您的CA列在Android 7.0及以上版本的受信任凭据列表中时才需要”,在受信任凭据列表中有两个子列表,“系统信任”列表和“用户信任”列表,哪个列表需要Mozilla CA的包含过程?两个都需要吗?我认为我需要安装我的CA到设置-->安全-->受信任的凭据(用户选项卡)中,也就是用户信任列表。 - Mellon
根据文档,Mozilla CA 包含过程需要将 CA 添加到标准化的系统 CA 集合中,因此它将被添加到“受信任”的列表中。对于“用户信任”的列表,我认为当您在“network_security_config”中添加您的证书时,您可能会在“用户信任”中看到它(我没有检查过)。 - Pravin Divraniya
显示剩余2条评论

6
除了更改如何配置Ca(@Pravin D的答案)外,Android还将从6到7更改了加载pkcs12证书的方式。 我们需要注意以下重要元素: 导入pkcs12时,根CA是否被导入为受信任的CA?
  • Android 6:是
  • Android 7:否
我在哪里可以查看已受信任的凭据?
  • Android 6:设置-->安全-->受信任的凭据(系统和用户)
  • Android 7:设置-->安全-->受信任的凭据(系统和用户标签)
如何安装用户凭据?
  • Android 6:pkcs#12文件、证书文件、通过编程方式
  • Android 7:pkcs#12文件(没有私钥)、证书文件、通过编程方式、自定义CA配置(@ Pravin D的答案)
在哪里可以查看用户凭据(包括私钥)?
  • Android 6:不能从设置中查看
  • Android 7:设置-->安全-->用户凭据
是否可以通过编程方式列出用户凭据?
  • Android 6:不可以
  • Android 7:不可以
通过深入审查Android代码,我们可以发现内部的Android密钥库被故意隐藏,只能从Android核心类中使用。因此无法实现绕过以列出用户凭据。

在Android 7中如何安装带有私钥的PKCS#12证书?如何通过编程方式安装此类证书? - Mellon
你有得到任何答案吗? - Neeraj Goel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接