首页 > 解决方案 > Ionic - 如何将证书添加到网络安全配置中?

问题描述

在我最新的 Ionic 应用程序发布后,Android 版本无法连接到我在 https 上的 API(但应用程序的 iOS 版本很好)。我试图将 API 调用更改为 http,但存储拒绝它作为不安全的用户数据传输。将 targetSdk 更改为 27 有所帮助,但同样,在商店上传后,它立即被拒绝并显示消息,即 APK 文件必须至少具有 targetSdk v28。

此连接问题仅发生在带有 --release 标志的构建上,并且仅在 Android 9.0 及更高版本上发生。通过调试,我没有收到任何错误消息,但 Android 只是无法连接到我的 API。我不想购买新证书,因为我现在拥有 2 年的 RapidSSL 证书,它适用于 iOS 和低于 v9.0 的 Android。

我的问题是,我想将我在 API 上使用的 pem 证书添加到 netwrok_security_config.xml 中,因为我在这里被告知https://developer.android.com/training/articles/security-config

所以该文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">0.0.0.0</domain>
        <domain includeSubdomains="true">(my domain IP address)</domain>
        <domain includeSubdomains="true">(my domain)</domain>
    </domain-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/my_ca/cert.pem"/>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

我已经尝试过服务器上的 .pem,甚至服务器上的 .crt,结果仍然相同。在 config.xml 我也将此文件添加为资源文件,因此它位于 res 文件夹下的生成平台文件夹中: <resource-file src="resources/android/raw/my_ca/cert.pem" target="app/src/main/res/raw/my_ca/cert.pem" />

还有这一行,它适用于 Android >9.0 能够建立 HTTP 连接,但以防万一: <application android:usesCleartextTraffic="true" />

有了这个看似很好的设置,我得到了构建错误:

network_security_config.xml:14:AAPT:错误:找不到资源 raw/my_ca/cert.pem(又名 com.myionicproject.app:raw/my_ca/cert.pem)。

当我尝试像他们在 Android 文档上所说的那样将仅文件夹路径放入证书 src 时,我收到错误:“资源文件不能是目录”。

当我尝试将其与相对路径链接时,构建会引发警告,即在 netwrok_security_config.xml 文件中,证书标记 src 属性只能具有值 system、user 或 @resource。然而它构建得很好,但是在打开应用程序并创建 API 请求后,应用程序每次都会崩溃。

顺便提一句。我还使用 Charles 代理进行调试,在将他们的 .pem 证书安装到手机中并运行该应用程序后,该应用程序运行良好,因为我猜代理信任服务器上的 ssl。该应用程序已在商店发布一年多,直到我最近切换到 ionic 4 之前它都可以正常运行。我找不到有人已经在处理这个问题,拥有 Ionic 并将他们的证书放入网络配置 xml。这里有人有这方面的经验吗?
谢谢

标签: androidionic-framework

解决方案


所以解决方案是服务器端的,最后我从 network_security_config.xml 中删除了证书内容。在我将我的 https api 链接放入 SSL 检查器 ( https://ssltools.digicert.com/checker/views/checkInstallation.jsp ) 后,它告诉我我没有中级证书。我在服务器上有一个,但只有 .pem 文件,我发现我也需要 Intermediate .crt,所以我下载了 Digicert 的 Intermediate(在 .txt 中),将文件扩展名更改为 .crt 并将其放在服务器上Apache config 中的新行: SSLCertificateChainFile /etc/apache2/myproject/intermediate.crt 重新启动,现在它可以工作了。

仅在版本 9+ 的 Android 设备上会导致问题,并且仅在生产中(使用 --release 标志构建)


推荐阅读