android - 为自定义 CA 使用网络安全配置

标签 android

我正在开发一个应用程序,我们在其中使用自定义 CA 进行用户登录。这些 CA 需要安装在设备上,否则登录将失败。我遇到了 network security configuration在 Android 上可用。看来我可以将 CA 添加到 res/raw 中的配置文件中。除了系统提供的 CA 之外,我还可以信任这些 CA。以下是当前配置文件的完成方式:

<network-security-config>
    <base-config>
        <trust-anchors>
            <!-- Trust preinstalled CAs -->
            <certificates src="system" />
            <!-- Additionally trust user added CAs -->
            <certificates src="user" />
            <certificates src="@raw/cert1" />
            <certificates src="@raw/cert2" />
            <certificates src="@raw/cert3" />
            <certificates src="@raw/cert4" />
            <certificates src="@raw/cert5" />
            <certificates src="@raw/cert6" />
            <certificates src="@raw/cert7" />
            <certificates src="@raw/cert8" />
            <certificates src="@raw/cert9" />
        </trust-anchors>
    </base-config>
</network-security-config>

我得到的 CA 文件有 .cer 扩展名。但是,有人告诉我它们是 PEM 编码的。因此,我继续将扩展名更改为 .pem,因为这是 Android 文档中的说明。

但是,即使在我将这些 CA 文件包含到我的代码库中并将该应用程序全新安装到设备上(之前未安装该应用程序),登录仍然失败。此外,当我进入设备上的设置时,设备上没有安装或物理上找不到 CA。那这样做的目的是什么?我是否正确实现了这一点?或者这是为了别的什么?

我可以在我的网络安全 XML 中指定 CA,还是需要 programatically install the CAs ?一如既往,我们将不胜感激任何对此的帮助。

最佳答案

These CAs need to be installed on the device, otherwise login will fail

用户需要通过“设置”应用手动安装这些证书。

In addition, when I go under the settings on the device, the CAs aren't installed or physically found on the device

正确。它们是您应用的网络安全配置的一部分。它们不会作为设备范围的证书安装在设备上。

What's the purpose of this then?

它们用于允许您的应用与某些服务器通信。

如果您的目标是您的应用程序与使用这些 CA 的服务器通信,那么您的设置就没问题,假设实际文件没问题(我遇到了这个问题 a while back ).

如果您的目标是让设备上的任何应用程序与使用这些 CA 的服务器通信,则需要手动安装证书,并且相关应用程序需要选择允许用户-提供的证书(即,他们的网络安全配置需要 <certificates src="user" /> )。

关于android - 为自定义 CA 使用网络安全配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53889050/

相关文章:

android - 什么是provideLayout()?.let { setContentView(it) }?

android - 插入失败时获取约束错误

java - 在gradle中获取Android项目的classpath

java - 单击 ListView 行时如何处理 JSON 的 NULL 结果?

android - 进度条传递 float 参数

android - RealmResults 与 RealmList 之间的区别?

android - 如何清除getIntent().getAction()的值

java - Gradle Build-Android Gradle 3.2 中的数据绑定(bind)错误

android - Android和使用依赖项。可以吗就像在代码中使用别人的构建实现。

android - 不同的Android权限级别