The*_*fou 7 https android retrofit self-signed-certificate
我正在创建一个简单的 Android 应用程序,将在封闭的本地网络中使用。在此本地网络中,正在运行 Flask 服务器,该服务器配置为通过 nginx 代理使用自签名证书。服务器的后端应用程序使用自签名证书可以正常工作,我已经使用浏览器和邮递员验证了这一点。(显然,我必须明确要求浏览器信任我的证书)。
几天来,我一直试图在网上找到一些关于如何让我的 Android 应用程序接受我的证书的明确答案,但我尝试过的所有事情都让我走进了死胡同。有时这些解决方案已被弃用,有时又对于这样一件微不足道的事情来说太复杂了。
http请求是使用Retrofit发送的;据我了解,我必须以某种方式配置改造实例的 http 客户端以接受我的证书。
我已经设法使用接受任何证书的客户端,但这不是我想要的。理想情况下,我的证书将添加到官方 CA 默认信任的证书“集”中,以便应用程序也可以向外部资源发送请求。
那么,假设后端应用程序运行在例如 192.168.1.10:443 上,我该如何处理呢?
注意:我已阅读此处给出的说明https://developer.android.com/training/articles/security-config.html#TrustingAdditionalCas 并添加了
android:networkSecurityConfig="@xml/network_security_config"
到我的清单文件,但我收到以下错误:
Hostname 192.168.1.10 not verified: certificate sha256/...../.....
并继续列出证书的信息,如通用名称等。
The*_*fou 13
Shlomi Katriel 的答案是我已经尝试过的,但它间接引导我找到了解决方案。请记住,我能够解决这个问题的唯一原因是因为我拥有服务器的 root 访问权限,并且可以随心所欲地使用它。
这个 答案基本上就是解决整个问题的关键。我将发布所有步骤,以防其他人需要。
步骤 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
Run Code Online (Sandbox Code Playgroud)
将 1.2.3.4 替换为您服务器的本地 ip。这将在证书的 subjectAltName 属性中包含服务器的本地 IP。如果没有这个,您将不断收到错误“主机名...未验证...”
在正在运行的 nginx 实例中使用证书是一个不同的主题,可以轻松完成,并且在线有大量资源。
步骤 2res打开 android studio 并在name下创建一个新的 android 资源目录(如果您还没有)raw。在此目录中,复制上述命令生成的 .crt 文件的内容。
步骤3res在named下创建android资源目录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>
Run Code Online (Sandbox Code Playgroud)
使用您在步骤 2 中复制的证书文件的文件名,而不是“证书”。
步骤 4添加android:networkSecurityConfig="@xml/network_security_config"到 AndroidManifest.xml 中的应用程序元素
| 归档时间: |
|
| 查看次数: |
12101 次 |
| 最近记录: |