首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使charles proxy与Android 7 nougat协同工作?

如何使charles proxy与Android 7 nougat协同工作?
EN

Stack Overflow用户
提问于 2016-08-29 21:06:57
回答 5查看 60.4K关注 0票数 108

Android7给证书的处理方式(http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html)带来了一些变化,不知怎么的,我再也不能让我的Charles工作了。

我的network_security_config.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

我在调试模式下运行。但无论如何,我得到了javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

不用说,我确实从Settings -> Security -> Install from storage安装了一个Settings -> Security -> Install from storage证书。证书显示在User Credentials中,而不是在Trusted credentials -> User中。在我的棒棒糖设备上,证书列在那里。

我使用okhttp3作为HTTP库。

知道我做错了什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-08-30 01:31:16

基于OP注释的故障排除线程,答案是只安装代理的CA证书作为受信任的,而不是它的cert +私钥。

造成这一问题的因素有两个:

  1. 不仅安装MiTM代理的CA证书,还安装它的私钥(从而使设备上的VPN应用程序能够从其他应用程序中解密/MiTM网络通信)。您不需要设备上的MiTM代理私钥。
  2. 除了cert之外,包含私钥的文件的Settings -> Security -> Install from storage流的行为也会发生变化。这种行为的变化掩盖了上述问题。

在努格特之前,除了证书之外,包含私钥的文件的Settings -> Security -> Install from storage流错误地将证书安装为可信的服务器身份验证(例如,HTTPS、TLS,从而使MiTM成功),此外还可以正确安装用于将此Android设备身份验证到服务器的客户端证书。在Nougat中,错误被修复,这些证书不再作为可信的服务器身份验证安装。这可以防止客户端身份验证凭据影响(削弱)到服务器连接的安全性。在您的场景中,这会阻止MiTM的成功。

更复杂的是,Settings -> Security -> Install from storage没有为用户提供一种明确的方式来指定他们是在安装客户端身份验证凭证(私钥+证书链)还是服务器身份验证信任锚(只是CA证书--不需要私钥)。因此,Settings -> Security -> Install from storage流通过假设如果指定了私钥,那么它必须是客户/用户身份验证凭据还是服务器身份验证信任锚,从而猜测它是在处理客户/用户身份验证凭据。在您的情况下,它错误地假定您安装的是客户端/用户身份验证凭据,而不是服务器身份验证信任锚。

关于您的网络安全Config,您可能应该将应用程序配置为在调试模式下也信任"system“信任锚(调试-重写部分)。否则,应用程序的调试构建将无法工作,除非连接是由代理MiTM完成的,该代理的CA证书在Android设备上安装为可信的。

票数 26
EN

Stack Overflow用户

发布于 2016-08-30 12:43:37

解决方案是不使用.p12,只需使用Chrome (在wifi上配置了代理)导航到http://charlesproxy.com/getssl安装下载的.pem文件

我在运行Android7.0的Nexus5X上也遇到了同样的问题。以前有从Charles3.11.5导出的.p12 (帮助->SSL代理->导出Charles根证书和私钥)。当我试图从电话(设置->安全->从存储中安装)安装.p12时,它只出现在“用户凭据”下,从未出现在“可信凭据”下,当然,带有Charles的SSL也不起作用。

用于Android7.0的总“如何操作”应该是这样的:

  1. 配置WiFi +代理(查尔斯需要它的方式)。连接它。
  2. 在设备上,使用Chrome导航到http://charlesproxy.com/getssl,接受下载.pem的请求,然后按“打开”,启动“证书安装程序”应用程序。使用它将证书安装为"VPN和应用程序“。
  3. 将属性android:networkSecurityConfig="@xml/network_security_config"放在Manifest.xml处的<application>
  4. 使用第一篇文章中的内容创建res/xml/NetworkSecurityconfig.xml(完全正确)。
  5. 启动Charles和app,玩得开心。

P.S.检查设备上的日期/时间。应该是对的。

票数 122
EN

Stack Overflow用户

发布于 2020-09-05 23:26:52

对我来说,SSL代理在release构建变体中不起作用。在debug工作过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39215229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档