列出存储在用户凭据中的证书
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 及以下的应用程序完成)。我还没有读到任何可以显式访问用户凭据存储的方法。 我在<trust-anchors>
中添加了<certificates src="user"/>
,但是,我的应用仍然不信任位于“用户凭据”下的我的证书。
我认为你可能误解了Settings-->Security-->User credentials
。它显示用户安装的证书和私钥,而不是受信任的证书。 Android6 可以管理用户证书,但您无法在设置中看到它们,只有根 CA。当您安装 PKCS#12 时,可以在 KeyChain 中访问私钥,并且可以将根 CA 安装为 AndroidCAStore
中的用户信任凭证。 AndroidCAStore 包含用户和系统条目,是您在 Android 6 和 7 中看到的内容。如果您正在寻找一种列出私钥(用户凭据的内容)的方法,则没有 API。
@pedrofb,不,我没有误解,例如在 Android 6 中,当我安装我的证书和私钥时,它转到 Settings ---> Security-->Trusted credentials(Users tab)
,但在 Android 7 中,它转到不受信任的 Settings --> Security-->User credentials
。我的问题是我如何知道在 Android 7 中我的证书安装在 Settings-->Security-->User credential
中?我的证书不能从 AndroidCAStore 中列出,我已经尝试过了。 AndroidCAStore 仅列出受信任的条目。
我已经用真实的证书 6 和 7 检查了它。在 android 6 中,中间证书和根 CA 安装在 AndroidCAStore(不是叶子)中,但在 android 7 中,它没有。可以看到Settings-->Security-->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)及更高版本)。
在您的 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 Inclusion Process,然后针对 Android 提交 feature request,以将该 CA 添加到标准化的系统 CA 集中。
如果有任何进一步的帮助,请告诉我。
希望这会对您有所帮助。继续编码!!!
【讨论】:
两个问题:1. 对于我的应用程序,我需要安装自己的根证书以信任 Android 7 中的存储。您是说 Mozilla CA 包含过程是必须执行的过程才能拥有我的Android 7 信任根证书? 2.<domain includeSubdomains="true">example.com</domain>
是什么,我必须放这个吗?这个子域是什么?我的意思是我知道我有一个要安装到信任存储的根证书,但是我从哪里获得子域?
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 ---> 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
是否可以通过编程方式列出用户凭据?
Android 6:否 Android 7:否深入审查 Android 代码,内部 Android Keystore 被故意隐藏,仅可从 Android 核心类中使用。无法实现列出用户凭据的解决方法
【讨论】:
在 Android 7 中使用私钥安装 pkcs#12 怎么样?如何以编程方式安装此类证书?以上是关于列出存储在用户凭据中的证书的主要内容,如果未能解决你的问题,请参考以下文章
如何使用keytool列出存储在PKCS12密钥库中的证书?
来自 CA 的 PKCS12 Java 密钥库和 Java 中的用户证书
ODBC 连接凭据如何存储在 MS Access 中? [关闭]