【问题标题】:Ionic - how to add certificate into Network security config?Ionic - 如何将证书添加到网络安全配置中?
【发布时间】:2020-05-22 05:50:06
【问题描述】:

在我最新的 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 文件夹下的生成平台文件夹中: &lt;resource-file src="resources/android/raw/my_ca/cert.pem" target="app/src/main/res/raw/my_ca/cert.pem" /&gt;

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

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

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。这里有人有这方面的经验吗?
谢谢

【问题讨论】:

    标签: android ionic-framework


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      对于 Android,我的 network_security_config 如下所示

      <?xml version="1.0" encoding="utf-8"?>
      <network-security-config>
          <domain-config cleartextTrafficPermitted="false">
              <domain includeSubdomains="true">https://somedomain.com/</domain> 
              <pin-set expiration="2020-10-03">
                  <pin digest="SHA-256">server pin</pin>
              </pin-set>      
          </domain-config>
      </network-security-config>
      

      我的 SDK 是

      defaultMinSdkVersion=19 
      defaultTargetSdkVersion=28 
      defaultCompileSdkVersion=28
      

      而且它工作正常。我使用的是 Ionic 3。 顺便说一句,我也在寻找 iOS SSL pinning。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-02
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 1970-01-01
        • 2017-01-07
        • 2018-07-30
        相关资源
        最近更新 更多