如何使用Android 7牛轧糖让查尔斯代理工作?

mbo*_*nin 93 ssl android android-7.0-nougat

Android 7引入了对证书处理方式的一些更改(http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html),不知怎的,我不能让我的Charles代理工作了.

我的network_security_config.xml:

<?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>
Run Code Online (Sandbox Code Playgroud)

我正在调试模式下运行.但不管怎样,我明白了javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

不用说,我确实安装了pfx证书Settings -> Security -> Install from storage.证书显示在User Credentials但不在Trusted credentials -> User.在我的棒棒糖设备上,证书列在那里.

我正在使用okhttp3作为HTTP库.

知道我做错了什么吗?

Ale*_*sov 107

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

我在运行Android 7.0的Nexus 5X上遇到了完全相同的问题.以前从Charles 3.11.5(帮助 - > SSL代理 - >导出查尔斯根证书和私钥)导出.p12.当我尝试从手机安装.p12(设置 - >安全 - >从存储安装)时,它只出现在"用户凭据"下,而不是"受信任的凭据",当然SSL与Charles代理不起作用.

Android 7.0的总计"操作方法"如下:

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

PS检查设备上的日期/时间.应该是正确的.

  • 可能只有我,但这些步骤在7.1.1中对我不起作用了.我最近做了更新 (3认同)
  • 关于这个好答案的一个重要说明:如果您的应用程序针对的是API 23或更低版本,则不需要执行步骤3和4.事实上,如果您拥有API 23,则无法编译network-security-config内容或更低. (2认同)

Ale*_*bin 25

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

这个问题是由两个因素造成的:

  1. 不仅安装MiTM代理的CA证书,还安装其私钥(从而使设备上的VPN应用程序能够解密来自其他应用程序的/ MiTM网络流量).您不需要设备上的MiTM代理私钥.

  2. Settings -> Security -> Install from storage除了cert(s)之外,Android Nougat还改变了包含私钥的文件的流行为.这种行为的改变揭示了上述问题.

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

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

PS关于您的Network Security Config,您应该将应用程序配置为在调试模式下信任"系统"信任锚(debug-overrides部分).否则,除非在Android设备上将CA证书安装为受信任的代理进行MiTM连接,否则应用程序的调试版本将无法运行.

  • 同意这个答案解释了发生了什么但是不清楚应该做什么步骤. (4认同)
  • 这个答案不清楚.请参考下面的@stkent的答案. (3认同)