【问题标题】:Android emulator is not able to trust Charles proxy certificateAndroid 模拟器无法信任 Charles 代理证书
【发布时间】:2020-10-18 18:41:16
【问题描述】:

我正在关注this tutorial 以监控 Android 版本 7 模拟器上的 https 流量。

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

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

可以从设置 -> 安全 -> 受信任的凭据 -> 用户选项卡查看此证书。

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

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

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

为什么证书不同?

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

我使用的是最新的 Charles 代理,版本 4.5.6。

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

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

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

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

但是我还是看不到安卓应用和服务器之间的https流量。

这是错误信息:

这是我的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>

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

安卓应用的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文件放到安卓模拟器中并安装。

我不确定上述步骤是否会导致应用无法信任 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>

【问题讨论】:

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


    【解决方案1】:

    为什么证书不同?

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

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

    证书信任的工作方式是您信任一组 CA 证书,并且每当您收到要验证的证书时,您都会查看谁颁发了该证书,并根据您拥有的 CA 查看您是否信任它们(在某些情况下,信任链中包含几个步骤,因此您需要沿着它向上走,直到找到您信任的证书,或者找到根目录并放弃)。

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

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

    显示的证书不是问题的原因,因此很难提供更多详细信息。查尔斯需要一些手动配置。您能否添加更多关于您所做的事情以及您看到的错误的信息?

    如果您不是特别喜欢 Charles,HTTP Toolkit 作为替代方法可能会有所帮助。这是我一直在研究的一个开源工具,因为 Charles 像这样设置会很痛苦。它做的所有事情都是一样的,但是证书设置是完全自动化的,所以你不会遇到这个问题。

    【讨论】:

    • 感谢您的信息。我已经提供了有关我的情况的更多详细信息。
    • @brian 您是否在应用清单中引用了 network_security_config.xml?你能分享你在哪里做的吗?由于某种原因,它肯定看起来没有被使用。预计浏览器会失败,因为(与 chrome 不同)也不信任用户证书。
    • 是的,我在AndroidManifest.xml 文件中引用了network_security_config.xml 文件。
    • 对了,为什么浏览器不信任用户证书?
    • 只是没有——出于某种原因,他们没有决定专门选择加入。你得问他们:-)。对于您的配置,我认为您缺少 &lt;trust-anchors> 周围的 &lt;base-config&gt; 元素包装器。在这里与我的示例进行比较:httptoolkit.tech/docs/guides/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多