จะทำให้ Charles Proxy ทำงานกับ Android 7 nougat ได้อย่างไร


103

Android 7 แนะนำการเปลี่ยนแปลงบางอย่างในการจัดการใบรับรอง ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) และฉันไม่สามารถทำให้ Charles Proxy ของฉันทำงานได้อีกต่อไป

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.แต่ไม่ว่าสิ่งที่ฉันได้รับ

ไม่จำเป็นต้องพูดว่าฉันติดตั้งไฟล์ pfxใบรับรองจากSettings -> Security -> Install from storage. แสดงให้เห็นว่าใบรับรองในแต่ไม่ได้อยู่ในUser Credentials Trusted credentials -> Userใบรับรองจะแสดงอยู่ในอุปกรณ์อมยิ้มของฉัน

ฉันใช้ okhttp3 เป็นไลบรารี HTTP

มีความคิดว่าฉันทำอะไรผิดหรือเปล่า?


1
ในการทดสอบอย่างรวดเร็วให้ลองเพิ่ม / ย้ายuserรายการเข้าไปใน<base-config>และดูว่าการเปลี่ยนแปลงสำคัญ ไม่ควร แต่จะใช้เวลาสักครู่ในการลอง
CommonsWare

คุณไม่จำเป็นต้องเพิ่ม CA ที่ชัดเจนสำหรับ Charles ในdeveloper.android.com/training/articles/security-config.html : 'Trusting Additional CAs' เนื่องจาก Charles CA เป็น CA ที่สร้างขึ้นเองและจะไม่อยู่ใน ห่วงโซ่ความไว้วางใจระบบ Android?
Morrison Chang

@ Morisson Chang: ฉันไม่ต้องการฝัง Charles CA ลงในแอปฉันต้องการเพิ่มด้วยตนเองในโทรศัพท์สำหรับการพัฒนาของฉันเหมือนที่ฉันเคยทำ ตั้งแต่Settings -> Security -> Install from storage
mbonnin

1. คุณอ้างอิง network_security_config.xml ใน AndroidManifest.xml ของแอปอย่างไร 2. ช่วยลิงค์ไฟล์. pfx หน่อยได้ไหม ฉันคิดว่ามันมีเพียงใบรับรอง CA (ไม่มีคีย์ส่วนตัว) ดังนั้นจึงควรเผยแพร่ ฉันถามเพราะถ้า. pfx มีคีย์ส่วนตัวจะถือว่าเป็นไฟล์ใบรับรองไคลเอ็นต์ดังนั้น CA จากไฟล์จะไม่ได้รับการติดตั้งว่าเชื่อถือได้สำหรับการตรวจสอบสิทธิ์เซิร์ฟเวอร์
Alex Klyubin

1
@AlexKlyubin hurra มันใช้งานได้แล้ว :) ฉันเดาว่าฉันต้องรีบูตชาร์ลหรือแอพหรือสิ่งอื่นใด ฉันสับสนเพราะฉันได้ติดตั้งไฟล์. pfx เดียวกันบนอุปกรณ์ Android นับไม่ถ้วนก่อนตังเมและพวกเขาก็จำได้ว่าโอเค แต่ตอนนี้ทุกอย่างก็ดีแล้ว คุณช่วยเขียนคำตอบเพื่อให้ฉันอนุมัติได้ไหม
mbonnin

คำตอบ:


26

จากเธรดการแก้ปัญหาของความคิดเห็นสำหรับ OP คำตอบคือการติดตั้งเฉพาะใบรับรอง CA ของพร็อกซีที่เชื่อถือได้ไม่ใช่ใบรับรอง + คีย์ส่วนตัว

ปัญหาเกิดจากสองปัจจัย:

  1. การติดตั้งไม่เพียงแค่ใบรับรอง CA ของพร็อกซีของ Mi ™เท่านั้น แต่ยังรวมถึงคีย์ส่วนตัวด้วย (ทำให้แอป VPN บนอุปกรณ์สามารถถอดรหัส / การรับส่งข้อมูลเครือข่าย MiTM จากแอปอื่น ๆ ) คุณไม่จำเป็นต้องใช้คีย์ส่วนตัวของพร็อกซี MiTM บนอุปกรณ์

  2. Android Nougat เปลี่ยนพฤติกรรมของSettings -> Security -> Install from storageโฟลว์สำหรับไฟล์ที่มีคีย์ส่วนตัวนอกเหนือจากใบรับรอง การเปลี่ยนแปลงพฤติกรรมนี้เปิดโปงปัญหาข้างต้น

ก่อนที่จะมี Nougat Settings -> Security -> Install from storageโฟลว์สำหรับไฟล์ที่มีคีย์ส่วนตัวนอกเหนือจากการติดตั้งใบรับรองที่ไม่ถูกต้องตามที่เชื่อถือได้สำหรับการตรวจสอบความถูกต้องของเซิร์ฟเวอร์ (เช่น HTTPS, TLS ทำให้ MiTM ของคุณประสบความสำเร็จ) นอกเหนือจากการติดตั้งอย่างถูกต้องเป็นใบรับรองไคลเอ็นต์ที่ใช้สำหรับ การตรวจสอบอุปกรณ์ Android นี้กับเซิร์ฟเวอร์ ใน Nougat ข้อบกพร่องได้รับการแก้ไขและใบรับรองเหล่านี้จะไม่ได้รับการติดตั้งที่เชื่อถือได้สำหรับการตรวจสอบเซิร์ฟเวอร์อีกต่อไป สิ่งนี้ป้องกันไม่ให้ข้อมูลรับรองการพิสูจน์ตัวตนไคลเอ็นต์ส่งผลต่อ (การลดลง) ความปลอดภัยของการเชื่อมต่อกับเซิร์ฟเวอร์ ในสถานการณ์ของคุณสิ่งนี้จะป้องกันไม่ให้ MiTM ของคุณประสบความสำเร็จ

สิ่งที่ทำให้เกิดความซับซ้อนคือการSettings -> Security -> Install from storageไม่ให้วิธีที่ชัดเจนสำหรับผู้ใช้ในการระบุว่าพวกเขากำลังติดตั้งข้อมูลรับรองการตรวจสอบความถูกต้องของไคลเอ็นต์ (คีย์ส่วนตัว + โซ่ใบรับรอง) หรือจุดยึดที่เชื่อถือได้สำหรับการรับรองความถูกต้องของเซิร์ฟเวอร์ (เพียงใบรับรอง CA - ไม่จำเป็นต้องใช้คีย์ส่วนตัว) . ด้วยเหตุนี้Settings -> Security -> Install from storageโฟลว์จึงคาดเดาว่ากำลังจัดการกับข้อมูลรับรองการรับรองความถูกต้องของไคลเอ็นต์ / ผู้ใช้หรือจุดยึดที่เชื่อถือได้สำหรับการพิสูจน์ตัวตนของเซิร์ฟเวอร์โดยสมมติว่าหากระบุคีย์ส่วนตัวจะต้องเป็นข้อมูลรับรองการตรวจสอบสิทธิ์ไคลเอ็นต์ / ผู้ใช้ ในกรณีของคุณถือว่าคุณกำลังติดตั้งข้อมูลรับรองการพิสูจน์ตัวตนไคลเอนต์ / ผู้ใช้อย่างไม่ถูกต้องแทนที่จะเป็นจุดยึดที่เชื่อถือได้สำหรับการตรวจสอบสิทธิ์เซิร์ฟเวอร์

ป.ล. ในเรื่องการกำหนดค่าความปลอดภัยเครือข่ายของคุณคุณควรกำหนดค่าแอปให้เชื่อถือจุดยึดที่เชื่อถือ "ระบบ" ในโหมดดีบักด้วย มิฉะนั้นการสร้างดีบักของแอปจะไม่ทำงานเว้นแต่การเชื่อมต่อจะเป็น MiTM โดยพร็อกซีที่ติดตั้งใบรับรอง CA ว่าเชื่อถือได้บนอุปกรณ์ Android


1
เกี่ยวกับ PS นี้: Trust anchors specified in debug-overrides are added to all other configurationsเอกสารกล่าวว่า ดังนั้นฉันรู้สึกว่ามันถูกเพิ่มลงใน 'base-config' และไม่ได้แทนที่มันทั้งหมด?
mbonnin

โอ้คุณพูดถูก คุณไม่จำเป็นต้องระบุจุดยึดที่เชื่อถือ "ระบบ" อย่างชัดเจนในการแก้ไขข้อบกพร่อง
Alex Klyubin

4
คำตอบนี้ไม่ชัดเจน โปรดดูคำตอบของ @ stkent ด้านล่าง
Adam Hurwitz

4
เห็นด้วยกับคำตอบนี้อธิบายถึงสิ่งที่เกิดขึ้น แต่ไม่มีความชัดเจนว่าควรทำตามขั้นตอนใด
StarWind0

116

วิธีแก้ปัญหาไม่ได้ใช้. p12เพียงแค่นำทางด้วย Chrome (ด้วยพร็อกซีที่กำหนดค่าไว้บน wifi) ไปที่http://charlesproxy.com/getsslและติดตั้งไฟล์ . pem ที่ดาวน์โหลดมา

ฉันมีปัญหาเดียวกันกับ Nexus 5X ที่ใช้ Android 7.0 ก่อนหน้านี้มีการส่งออก. p12 จาก Charles 3.11.5 (Help-> SSL Proxying-> Export Charles Root certificate and Private key) เมื่อฉันพยายามติดตั้ง. p12 จากโทรศัพท์ (การตั้งค่า -> ความปลอดภัย -> ติดตั้งจากที่เก็บข้อมูล) จะปรากฏเฉพาะใน "ข้อมูลรับรองผู้ใช้" และไม่เคยอยู่ที่ "ข้อมูลรับรองที่เชื่อถือได้" และแน่นอนว่า SSL กับพร็อกซีของ Charles ก็ไม่ทำงาน

"วิธีการ" ทั้งหมดสำหรับ Android 7.0 จะเป็นดังนี้:

  1. กำหนดค่าพร็อกซี WiFi + (วิธีที่ Charles ต้องการ) เชื่อมต่อ
  2. บนอุปกรณ์ไปที่http://charlesproxy.com/getsslยอมรับคำขอดาวน์โหลด. pem จากนั้นกด "เปิด" เพื่อเปิดแอป "Certificate installer" ใช้เพื่อติดตั้งใบรับรองเป็น "VPN และแอป"
  3. ใส่แอตทริบิวต์android:networkSecurityConfig="@xml/network_security_config"ไป<application>ที่ Manifest.xml
  4. สร้าง res / xml / network_security_config.xml ด้วยเนื้อหาจากโพสต์แรก (ถูกต้องทั้งหมด)
  5. เปิด Charles และแอพแล้วสนุก

ปล. ตรวจสอบวันที่ / เวลาบนเครื่อง มันควรจะถูกต้อง


2
หมายเหตุสำคัญสำหรับคำตอบที่ดีนี้: หากแอปของคุณกำหนดเป้าหมาย API 23 หรือต่ำกว่าคุณไม่จำเป็นต้องมีขั้นตอนที่ 3 และ 4 ในความเป็นจริงคุณจะไม่สามารถรวบรวมสิ่งที่กำหนดค่าความปลอดภัยเครือข่ายได้หากคุณมี API 23 หรือต่ำกว่า
David Ferrand

1
นี่เป็นโซลูชันที่ยอดเยี่ยมสำหรับ Android 7.0 ชัดเจนกว่าข้อมูลอย่างเป็นทางการของ Charles Proxy
Adam Link

3
น่าจะมี แต่ฉัน แต่ขั้นตอนเหล่านี้ไม่ได้ผลสำหรับฉันอีกต่อไปใน 7.1.1 ฉันเพิ่งทำการอัปเดต
satyajit

@satyajit โซลูชันนี้ใช้ได้กับฉันบน Android 7.1.1 บน Google Pixel
Dick Lucas

มีหรือไม่มีขั้นตอนที่ 3 และ 4?
satyajit


-1

ฉันใช้ Android 7.1.1 นี่คือวิธีการตั้งค่าบนอุปกรณ์ของฉัน (OnePlus One) - โดยไม่มีการเปลี่ยนแปลงรายการ (ฉันกำหนดเป้าหมาย API 21 สำหรับแอปของฉัน):

ใน Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. ขั้นตอนนี้จะให้IP พร็อกซีและหมายเลขพอร์ตรวมถึงลิงก์ไปยังตำแหน่งที่คุณควรดาวน์โหลด charles proxy SSL

บนโทรศัพท์ของคุณ:

  1. Wifi Settings > Modify Network > Advanced Options. ตั้งค่า Proxy เป็นManualและป้อนหมายเลข IP และพอร์ตที่คุณได้รับจาก Charles เข้าProxy hostnameและProxy portตามลำดับ

  2. (ไม่บังคับ) คุณอาจหรือไม่สามารถเข้าถึงลิงค์chls.pro/ssl ที่ Charlesให้มาก่อนหน้านี้ บนอุปกรณ์ของฉันฉันได้รับแจ้งเสมอว่าฉันไม่มีการเชื่อมต่อเครือข่าย ฉันเพิ่ม charlesproxy.com ลงในBypass proxy forฟิลด์

  3. บนเบราว์เซอร์ของคุณไปที่ลิงก์ในขั้นตอนที่ 3 และดาวน์โหลดใบรับรองที่จำเป็น (หากใช้ไม่ได้บน Chrome ให้ดาวน์โหลด Dolphin Browser) คุณสามารถตั้งชื่อใบรับรองของคุณด้วยชื่ออะไรก็ได้

กลับไปที่ Charles Proxy:

  1. คุณควรได้รับการแจ้งให้โทรศัพท์AllowหรือDenyโทรศัพท์ของคุณใช้พรอกซีหากการตั้งค่าของคุณเป็นค่าเริ่มต้นเพื่อแจ้งให้คุณเชื่อมต่อระยะไกล

ตอนนี้คุณสามารถใช้ Charles บน Nougat 7.1.1 ได้แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.