Android模拟器无法信任Charles代理证书

时间:2020-06-28 14:33:00

标签: android ssl ssl-certificate charles-proxy man-in-the-middle

我正在跟踪this tutorial来监视Android 7版模拟器上的https流量。

我感到奇怪的是,我从chls.pro/ssl下载的证书与通过Charles代理访问网站时遇到的证书不同。

这是我从chls.pro/ssl获得的证书

enter image description here

可以从“设置”->“安全性”->“可信凭据”->“用户”选项卡中查看此证书。

这是我通过Charles代理访问任何网站时发现的证书:

enter image description here

从图片中可以看到,它们的指纹是不同的。

这使我的Android仿真器在通过Charles代理访问网站时无法信任证书。

enter image description here

为什么证书不同?

如何在Android模拟器上查看https流量?

我正在使用最新的Charles代理,版本为4.5.6。

============================编辑================= =================

安全警告是由模拟器上的浏览器引起的。

我最初使用的是“浏览器” 7.1.2版来访问网站。

enter image description here

在我将其替换为Chrome后,不再显示安全警告。而且我可以查看Chrome和网站之间的https流量。

但是我仍然无法查看Android应用和服务器之间的https流量。

这是错误消息:

enter image description here

这是我的network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors> 
            <!-- Trust user added CAs -->
            <certificates src="user" overridePins="true" />
        </trust-anchors> 
    </base-config>
</network-security-config>

============================编辑================= =================

Android应用程序的apk文件是从Google Play下载的。

这是我对apk文件所做的

  1. 使用Apk Extractor获取apk文件。

  2. 使用apktool d ${APK_FILE}.apk提取文件。

  3. 修改其network_security_config.xmlAndroidManifest.xml

  4. 运行apktool b ${APK_FILE}将提取的文件还原回apk文件。

  5. 运行apksigner sign -ks my-key.keystore ${APK_FILE}/dist/${APK_FILE}.apk对apk文件签名。

  6. 将apk文件放入Android模拟器并安装。

我不确定上述步骤是否会导致应用程序无法信任Charles证书。

这是我修改之前的原始network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">appapi.appname.com</domain>
    </domain-config>
</network-security-config>

1 个答案:

答案 0 :(得分:0)

为什么证书不同?

其中显示的第一个证书是Charles的“证书颁发机构”(CA)证书。它是自签名的(请注意“颁发者”详细信息与证书的详细信息相同),并且不适用于特定域。

第二个证书是由Charles的CA证书颁发并由其签名的网站证书,其主题为单个特定域(未显示),可用于验证与该特定域的连接。 / p>

证书信任的工作方式是,您信任一组CA证书,并且每当收到要验证的证书时,您便查看谁颁发了该证书,并根据所拥有的CA来查看是否信任它们(在某些情况下,信任链中有几个步骤,因此,您逐步进行下去,直到找到您信任的证书或扎根并放弃)。

这有意义吗?在实践中,Charles预先生成了一个您需要信任的CA,然后根据需要为每个需要该域的单个域生成新证书,并用其CA对其进行签名,然后您应该信任那些证书,因为您信任Charles。

如何在Android模拟器上查看https流量?

显示的证书不是造成问题的原因,因此很难提供更多详细信息。 Charles需要一些手动配置。您是否可以添加有关您所做的一切以及所看到的错误的更多信息?

如果您不特别想嫁给Charles,HTTP Toolkit可能会作为替代方法很有用。这是我一直在使用的开源工具,因为Charles可能很难进行这样的设置。它具有相同的功能,但是证书设置是完全自动化的,因此您不会遇到这个问题。