因为Android7之后google更改了安全策略,用户添加的CA证书不能再用于安全链接,意思就是你本身安装的Charles的证书也没有卵用了。当咱们抓HTTPS的包时候会出现下面的问题 java
2019-02-11 14:27:12.232 8913-8954/? W/System.err: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2019-02-11 14:27:12.232 8913-8954/? W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:361)
2019-02-11 14:27:12.232 8913-8954/? W/System.err: at com.android.okhttp.Connection.connectTls(Connection.java:235)
2019-02-11 14:27:12.232 8913-8954/? W/System.err: at com.android.okhttp.Connection.connectSocket(Connection.java:199)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.Connection.connect(Connection.java:172)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.example.android.sdk.http.HttpRequest.execute(HttpRequest.java:73)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at com.example.android.sdk.http.HttpRequest$1.run(HttpRequest.java:110)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
2019-02-11 14:27:12.233 8913-8954/? W/System.err: at java.lang.Thread.run(Thread.java:761)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:563)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:444)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:508)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:401)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:375)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:304)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
2019-02-11 14:27:12.235 8913-8954/? W/System.err: at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:88)
2019-02-11 14:27:12.236 8913-8954/? W/System.err: at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:178)
2019-02-11 14:27:12.236 8913-8954/? W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:596)
2019-02-11 14:27:12.236 8913-8954/? W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
2019-02-11 14:27:12.236 8913-8954/? W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)
2019-02-11 14:27:12.236 8913-8954/? W/System.err: ... 16 more
2019-02-11 14:27:12.236 8913-8954/? W/System.err: Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
2019-02-11 14:27:12.236 8913-8954/? W/System.err: ... 28 more
复制代码
该方法针对未Root的设备,直接参看Android官方的文档developer.android.com/training/ar… 可是这个办法有个局限就是只能抓取本身APP的包,没法抓取第三方APP,并且操做麻烦。android
本文章主要讲的是该方法,一个一劳永逸的方法,就是将Charles的证书安装为系统证书。shell
至于Root的方法我就再也不累述浏览器
根据Charles的help浏览chls.pro/ssl
下载证书,你能够在设备上下载后adb pull
到电脑上,也能够直接用电脑浏览器下载。安全
系统证书在目录/system/etc/security/cacerts/
下,咱们看到 bash
<Certificate_Hash>.<Number>
,文件名是一个Hash值,然后缀是一个数字。后缀名的数字是为了防止文件名冲突的,好比若是两个证书算出的Hash值是同样的话,那么一个证书的后缀名数字能够设置成0,而另外一个证书的后缀名数字能够设置成1.
咱们用下面的命令计算出证书文件的Hash值 openssl x509 -subject_hash_old -in <Certificate_File>
ui
咱们将重命名好的证书adb push
到/sdcard/Download
,而后将其复制到/system/etc/security/cacerts/
文件夹。 google
mount -o rw,remount /system
命令将system分区挂在为可读写。
adb root
adb disable-verity
adb reboot
adb remount
adb shell
mount -o rw,remount /system
复制代码
复制好后将文件权限更改成644,并重启设备 spa
设置》安全》信任的凭证,咱们能够看到 .net