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

Posted

技术标签:

【中文标题】列出存储在用户凭据中的证书【英文标题】:list certificate stored in user credentials 【发布时间】:2017-03-14 19:08:48 【问题描述】:

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

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

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

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

但现在,在 Android 7 中,用户安装的证书会转到 Settings --> Security --> User credentials 下一个名为“用户凭据”的单独位置。

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

【问题讨论】:

阅读文档我会假设如果通过 <trust-anchors> 配置应用程序具有对用户证书的隐式访问权限(因为它会自动为 AP23 及以下的应用程序完成)。我还没有读到任何可以显式访问用户凭据存储的方法。 我在&lt;trust-anchors&gt; 中添加了&lt;certificates src="user"/&gt;,但是,我的应用仍然不信任位于“用户凭据”下的我的证书。 我认为你可能误解了Settings--&gt;Security--&gt;User credentials。它显示用户安装的证书和私钥,而不是受信任的证书。 Android6 可以管理用户证书,但您无法在设置中看到它们,只有根 CA。当您安装 PKCS#12 时,可以在 KeyChain 中访问私钥,并且可以将根 CA 安装为 AndroidCAStore 中的用户信任凭证。 AndroidCAStore 包含用户和系统条目,是您在 Android 6 和 7 中看到的内容。如果您正在寻找一种列出私钥(用户凭据的内容)的方法,则没有 API。 @pedrofb,不,我没有误解,例如在 Android 6 中,当我安装我的证书和私钥时,它转到 Settings ---&gt; Security--&gt;Trusted credentials(Users tab),但在 Android 7 中,它转到不受信任的 Settings --&gt; Security--&gt;User credentials。我的问题是我如何知道在 Android 7 中我的证书安装在 Settings--&gt;Security--&gt;User credential 中?我的证书不能从 AndroidCAStore 中列出,我已经尝试过了。 AndroidCAStore 仅列出受信任的条目。 我已经用真实的证书 6 和 7 检查了它。在 android 6 中,中间证书和根 CA 安装在 AndroidCAStore(不是叶子)中,但在 android 7 中,它没有。可以看到Settings--&gt;Security--&gt;User credential中安装了证书,但是AndroidCAStore中没有安装根CA。您必须手动安装它。我已经从.pfx 导出公共证书为.cer 并安装,然后显示 【参考方案1】:

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

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

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

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

    信任自定义 CA 进行调试 信任域的自定义 CA 为某些域信任用户添加的 CA 信任用户为所有域添加的 CA,但某些域除外 信任用户添加的 CA 以确保所有安全连接

所以,基本上您需要添加Security Configuration File 和Configure a custom CA(适用于Android 7.0(API 级别24)及更高版本)。

在您的 ma​​nifest.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 Inclusion Process,然后针对 Android 提交 feature request,以将该 CA 添加到标准化的系统 CA 集中。

如果有任何进一步的帮助,请告诉我。

希望这会对您有所帮助。继续编码!!!

【讨论】:

两个问题:1. 对于我的应用程序,我需要安装自己的根证书以信任 Android 7 中的存储。您是说 Mozilla CA 包含过程是必须执行的过程才能拥有我的Android 7 信任根证书? 2. &lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt; 是什么,我必须放这个吗?这个子域是什么?我的意思是我知道我有一个要安装到信任存储的根证书,但是我从哪里获得子域? 1) Mozilla CA 包含过程不是必须的,如果您希望您的 CA 在 Android 7.0 及更高版本的受信任凭据列表中,则需要它。 2) 这是您要建立安全连接的域和子域。如果您希望您的自定义 CA 信任所有域而不是选中此链接中的 #5 ' Trusting user-added CAs for all secure connections '。 android-developers.blogspot.in/2016/07/… 我还是想问问 Mozilla CA 包含过程。因此,正如您所说“如果您希望您的 CA 在 Android 7.0 及更高版本的受信任凭据列表中是必需的”,受信任凭据列表中有两个子列表,“系统受信任”列表和“用户受信任”列表,其中列表需要 Mozilla CA 包含过程?两个都?我想我需要将我的 CA 安装到 Settings-->Security-->trusted credentials(Users 选项卡),我的意思是用户信任列表。【参考方案2】:

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

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

Android 6:是的 Android 7:否

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

Android 6:Settings ---&gt; Security--&gt;Trusted credentials(系统和用户) Android 7:Settings ---&gt; Security--&gt;Trusted credentials(系统和用户选项卡)

如何安装用户凭据?

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

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

Android 6:在设置中不可用 安卓 7:Settings--&gt;Security--&gt;User credentials

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

Android 6:否 Android 7:否

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

【讨论】:

在 Android 7 中使用私钥安装 pkcs#12 怎么样?如何以编程方式安装此类证书?

以上是关于列出存储在用户凭据中的证书的主要内容,如果未能解决你的问题,请参考以下文章

如何使用keytool列出存储在PKCS12密钥库中的证书?

存储用户凭据 iOS 的推荐方式?

来自 CA 的 PKCS12 Java 密钥库和 Java 中的用户证书

ODBC 连接凭据如何存储在 MS Access 中? [关闭]

使用先前存储在数据库中的凭据执行发送电子邮件的 API 端点。 (使用 Gmail REST API)

在不使用 SharePoint API 的情况下列出 SharePoint 网站中的所有警报?