Charles SSL在最新的Android SDK和Emulator上代理问题

时间:2016-09-01 13:46:14

标签: android ssl charles-proxy

我不知道这是否与更新的Android Build Tools有关,因为我没有立即尝试但是我似乎无法让Charles在Android上使用SSL Proxying工作(之前工作正常)

简而言之,如果我在查尔斯的api端点上启用ssl代理,我会得到:

Caused by: java.security.cert.CertificateException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate expired at Wed Aug 31 10:09:00 GMT+02:00 2016 (compared to Thu Sep 01 15:18:53 GMT+02:00 2016)
at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:344)
at com.android.org.conscrypt.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:219)
at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:115)
at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:556)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:324)

当然我已经检查了我们的服务器证书(它们没有过期)。我已多次检查setup,我尝试删除模拟器(API 23& 24)并重新安装新的模拟器,我甚至尝试升级构建工具并将sdk版本编译为24并使用Java 8。我还尝试升级到Charles 4并重新安装根证书。

keytool -list -keystore / usr / libexec / java_home /jre/lib/security/cacerts -storepass changeit列出了Charles证书。 (适用于1.7和1.8 jdks)

Charles Root证书已在模拟器上正确安装,并于2044年到期

enter image description here

如果我在Charles上禁用SSL代理,那么在没有Charles运行的情况下,一切正常。

此外,使用运行API 24的模拟器时,例外情况略有不同:

Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:563)
at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:444)
at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:508)
at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:401)
at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:375)
at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:304)
at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:88)
at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:178)
at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:596)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)

更重要的是要注意,使用相同的api端点,相同的设置在iOS模拟器上运行良好。所以这肯定与Java / Android配置有关。

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

如果您的目标是API级别24,则会在Android 7.0中发生这种情况。现在,默认情况下,用户添加的CA不受信任,每个应用都必须明确选择加入。

要让您的应用信任Charles证书,请在AndroidManifest中声明自定义网络安全配置

<application
    android:networkSecurityConfig="@xml/network_security_config"
    >

使用以下配置在res/xml/network_security_config.xml中创建文件:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

更多信息:http://android-developers.blogspot.fr/2016/07/changes-to-trusted-certificate.htmlhttps://developer.android.com/training/articles/security-config.html

答案 1 :(得分:0)

我最终删除了所有gradle缓存文件夹和项目.gradle文件夹

rm -rf ~/.gradle/caches
rm -rf .gradle

并且迫使Kotlin使用v1.0.3而不是EAP版本,它再次起作用。我不知道这里到底出了什么问题。