Shlomi Katriel 的答案是我已经尝试过的,但它间接引导我找到了解决方案。请记住,我能够解决这个问题的唯一原因是因为我拥有服务器的 root 访问权限,并且可以随心所欲地使用它。
This https://stackoverflow.com/a/61809513/5763896答案基本上就是解决整个问题的关键。我将发布所有步骤,以防其他人需要。
Step 1创建您的自签名证书。就我而言,我使用了 openssl 实用程序。包含 -addext 标志非常重要。这是直接取自我上面链接的答案的示例:
openssl req \
-newkey rsa:2048 \
-nodes \
-x509 \
-days 36500 -nodes \
-addext "subjectAltName = IP.1:1.2.3.4" \
-keyout /etc/ssl/private/nginx-selfsigned2.key \
-out /etc/ssl/certs/nginx-selfsigned2.crt
将 1.2.3.4 替换为您服务器的本地 ip。这将在证书的 subjectAltName 属性中包含服务器的本地 IP。如果没有这个,您将不断收到错误“主机名...未验证...”
在正在运行的 nginx 实例中使用证书是一个不同的主题,可以轻松完成,并且在线有大量资源。
Step 2打开 android studio 并在下面创建一个新的 android 资源目录(如果您还没有)res
named raw
。在此目录中,复制上述命令生成的 .crt 文件的内容。
Step 3下创建一个android资源目录res
named xml
。在那里,创建一个新的 xml 文件,在我的例子中我称之为network_security_config.xml
。我在那里插入了以下内容:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="@raw/certificate"/>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
使用您在步骤 2 中复制的证书文件的文件名,而不是“证书”。
Step 4 Add android:networkSecurityConfig="@xml/network_security_config"
到 AndroidManifest.xml 中的应用程序元素