android - 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。这里有人有这方面的经验吗?
谢谢
解决方案
所以解决方案是服务器端的,最后我从 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 标志构建)
推荐阅读
- javascript - Ext.Component.setStyle('color', 'value') 似乎不起作用
- eclipse - EGit - 使用 ssh 推送到多个遥控器
- r - R:使用分组和汇总来制作数据透视表
- android - Playing two different streams (files) simultaneously with proper sync on Android
- javascript - How to replace phrases in a text for a given expression in JavaScript
- css - Bootstrap 样式按钮与链接完全相同
- r - r ggplot2 modify x axis labels of stacked bar plot with interaction aes
- ruby-on-rails - 当 ActiveRecord::RecordNotFound 未检测到用户等于 nil 时如何处理
- python - 在python中检查不止一种类型
- java - 为什么我的 POST 请求返回 400?URL 和 JSON 被验证为 OK