![](/img/trans.png)
[英]How to add network security configuration to enable Charles proxy SSL in Nougat?
[英]How to get charles proxy work with Android 7 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>
我在調試模式下運行。 但無論如何,我得到javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
.
不用說,我確實從Settings -> Security -> Install from storage
安裝了pfx
證書。 該證書顯示在User Credentials
中,但不顯示在Trusted credentials -> User
中。 在我的棒棒糖設備上,證書列在那里。
我正在使用 okhttp3 作為 HTTP 庫。
知道我做錯了什么嗎?
解決方案是不使用 .p12 ,只需使用 Chrome(在 wifi 上配置代理)導航到http://charlesproxy.com/getssl並安裝下載的 .pem 文件。
我在運行 Android 7.0 的 Nexus 5X 上遇到了完全相同的問題。 之前從 Charles 3.11.5 (Help->SSL Proxying->Export Charles Root certificate and Private key) 導出了 .p12。 當我嘗試從手機(設置->安全->從存儲安裝)安裝 .p12 時,它只出現在“用戶憑據”下,而從不出現在“受信任的憑據”下,當然帶有 Charles 代理的 SSL 不起作用。
Android 7.0 的總“操作方法”如下:
android:networkSecurityConfig="@xml/network_security_config"
放在 Manifest.xml 的<application>
中PS 檢查設備上的日期/時間。 它應該是正確的。
我編寫了一個腳本,為apk注入了所需的異常,並允許將Charles Proxy與應用程序一起使用。
這是Github https://github.com/levyitay/AddSecurityExceptionAndroid
根據 OP 評論的故障排除線程,答案是僅將代理的 CA 證書安裝為受信任的,而不是其證書 + 私鑰。
這個問題是由兩個因素引起的:
不僅安裝 MiTM 代理的 CA 證書,還安裝其私鑰(從而使設備上的 VPN 應用程序能夠解密來自其他應用程序的 MiTM 網絡流量)。 您不需要設備上的 MiTM 代理的私鑰。
Android Nougat 的行為更改Settings -> Security -> Install from storage
流Settings -> Security -> Install from storage
,文件除證書外還包含私鑰。 這種行為變化揭示了上述問題。
在 Nougat 之前,對於包含私鑰和證書的文件, 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
流Settings -> Security -> Install from storage
通過假設,如果指定了私鑰,則它必須是客戶端/用戶身份驗證憑據,從而猜測它是在處理客戶端/用戶身份驗證憑據還是服務器身份驗證信任錨. 在您的情況下,它錯誤地假設您正在安裝客戶端/用戶身份驗證憑據而不是服務器身份驗證信任錨。
PS 關於您的網絡安全配置,您可能應該將應用程序配置為在調試模式下也信任“系統”信任錨(調試覆蓋部分)。 否則,應用程序的調試版本將無法工作,除非連接由代理進行 MiTM,其 CA 證書安裝為受信任的 Android 設備。
我也遇到了同樣的錯誤並嘗試了各種方法,直到我讀到以下關鍵消息:“證書顯示在用戶憑據中,但不顯示在受信任的憑據中”。
所以問題是如何讓證書出現在那里,這些是我遵循的步驟:
我使用的是 Android 7.1.1,以下是我在我的設備 (OnePlus One) 上的設置方式 - 沒有更改清單(我的應用程序的目標是 API 21):
在查爾斯代理中:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
。 此步驟為您提供代理 IP 和端口號,以及指向您應下載 charles 代理 SSL 的位置的鏈接。在您的手機上:
Wifi Settings > Modify Network > Advanced Options
。 將代理設置為Manual
然后分別在Proxy hostname
和Proxy port
輸入您從 Charles 收到的 IP 和端口號。
(可選)您可能無法訪問 Charles 之前提供的chls.pro/ssl鏈接。 在我的設備上,我總是收到沒有網絡連接的通知。 我將 charlesproxy.com 添加到字段的Bypass proxy for
。
在您的瀏覽器上,轉到第 3 步中的鏈接並下載任何必要的證書(如果它在 Chrome 上不起作用,請下載 Dolphin Browser)。您可以使用任何名稱命名您的證書。
回到查爾斯代理:
Allow
或Deny
您的手機使用代理的提示。您現在可以在 Nougat 7.1.1 上使用 Charles。
對我來說,SSL 代理在release
版本變體中不起作用。 在debug
工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.