Làm thế nào để proxy charles hoạt động với Android 7 nougat?


101

Android 7 đã giới thiệu một số thay đổi đối với cách xử lý chứng chỉ ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) và bằng cách nào đó, tôi không thể làm cho proxy Charles của mình hoạt động được nữa.

Network_security_config.xml của tôi:

<?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>

Tôi đang chạy ở chế độ gỡ lỗi. Nhưng không có vấn đề gì, tôi nhận được javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Không cần phải nói, tôi đã cài đặt một pfxchứng chỉ từ Settings -> Security -> Install from storage. Chứng chỉ hiển thị trong User Credentialsnhưng không hiển thị trong Trusted credentials -> User. Trên thiết bị kẹo mút của tôi, các chứng chỉ được liệt kê ở đó.

Tôi đang sử dụng okhttp3 làm thư viện HTTP.

Bất kỳ ý tưởng những gì tôi đang làm sai?


1
Để kiểm tra nhanh, hãy thử thêm / chuyển usermột cái vào <base-config>và xem liệu những thay đổi đó có quan trọng không. Không nên, nhưng sẽ chỉ mất một chút thời gian để thử.
CommonsWare

Bạn có cần thêm CA rõ ràng cho Charles trong developer.android.com/training/articles/security-config.html : 'Tin tưởng CA bổ sung' vì Charles CA là CA tự tạo và sẽ không nằm trong Chuỗi tin cậy Hệ thống Android?
Morrison Chang

@Morisson Chang: Tôi không muốn nhúng Charles CA vào ứng dụng, tôi muốn có thể thêm nó theo cách thủ công trên điện thoại phát triển của mình như tôi đã từng làm. TừSettings -> Security -> Install from storage
mbonnin

1. Làm thế nào để bạn tham chiếu đến network_security_config.xml trong AndroidManifest.xml của ứng dụng? 2. Bạn có vui lòng liên kết tệp .pfx không? Tôi cho rằng nó chỉ chứa C cert của CA (không có khóa riêng) và do đó sẽ ổn để xuất bản. Tôi đang hỏi bởi vì, nếu .pfx chứa khóa riêng tư, nó sẽ được coi là tệp chứng chỉ ứng dụng khách và do đó CA từ tệp sẽ không được cài đặt làm tin cậy để xác thực máy chủ.
Alex Klyubin

1
@AlexKlyubin Hurra, nó đang hoạt động :). Tôi đoán tôi cần phải khởi động lại charles hoặc ứng dụng của mình hoặc bất cứ thứ gì khác. Tôi đã bối rối vì tôi đã cài đặt cùng một tệp .pfx trên vô số thiết bị Android trước khi nougat và chúng được công nhận là ok. Nhưng mọi thứ bây giờ đều tốt. Bạn có thể viết câu trả lời để tôi có thể chấp thuận không?
mbonnin

Câu trả lời:


26

Dựa trên chuỗi nhận xét khắc phục sự cố cho OP, câu trả lời là chỉ cài đặt chứng chỉ CA của proxy là đáng tin cậy, không phải chứng chỉ + khóa riêng tư của nó.

Vấn đề là do hai yếu tố:

  1. Cài đặt không chỉ chứng chỉ CA của proxy MiTM mà còn cả khóa riêng của nó (do đó cho phép các ứng dụng VPN trên thiết bị giải mã / lưu lượng mạng MiTM từ các ứng dụng khác). Bạn không cần khóa riêng của proxy MiTM trên thiết bị.

  2. Android Nougat thay đổi về hành vi của quy Settings -> Security -> Install from storagetrình đối với các tệp có chứa khóa riêng tư ngoài (các) chứng chỉ. Sự thay đổi trong hành vi này đã vạch trần vấn đề trên.

Trước Nougat, quy Settings -> Security -> Install from storagetrình cho các tệp chứa khóa riêng tư ngoài các chứng chỉ đã cài đặt sai các chứng chỉ được tin cậy để xác thực máy chủ (ví dụ: HTTPS, TLS, do đó làm cho MiTM của bạn thành công), ngoài việc được cài đặt chính xác làm chứng chỉ ứng dụng khách được sử dụng cho xác thực thiết bị Android này với máy chủ. Trong Nougat, lỗi đã được sửa và các chứng chỉ này không còn được cài đặt để xác thực máy chủ đáng tin cậy nữa. Điều này ngăn không cho thông tin xác thực máy khách ảnh hưởng (dệt) bảo mật của các kết nối đến máy chủ. Trong trường hợp của bạn, điều này ngăn không cho MiTM của bạn thành công.

Điều làm phức tạp vấn đề là Settings -> Security -> Install from storagekhông cung cấp một cách rõ ràng để người dùng chỉ định liệu họ đang cài đặt thông tin xác thực máy khách (khóa riêng tư + chuỗi cert) hay neo tin cậy xác thực máy chủ (chỉ cần chứng chỉ CA - không cần khóa riêng tư) . Do đó, Settings -> Security -> Install from storageluồng đoán xem nó đang xử lý thông tin xác thực xác thực máy khách / người dùng hay neo tin cậy xác thực máy chủ bằng cách giả định rằng, nếu khóa riêng được chỉ định, nó phải là thông tin xác thực khách / người dùng. Trong trường hợp của bạn, nó giả định không chính xác rằng bạn đang cài đặt thông tin xác thực máy khách / người dùng thay vì một mỏ neo tin cậy xác thực máy chủ.

PS Liên quan đến Cấu hình bảo mật mạng của bạn, bạn có thể nên định cấu hình ứng dụng để cũng tin cậy neo tin cậy "hệ thống" trong chế độ gỡ lỗi (phần ghi đè gỡ lỗi). Nếu không, gỡ lỗi các bản dựng của ứng dụng sẽ không hoạt động trừ khi các kết nối được MiTM bởi một proxy có chứng chỉ CA được cài đặt là đáng tin cậy trên thiết bị Android.


1
Về PS: tài liệu cho biết Trust anchors specified in debug-overrides are added to all other configurations. Vì vậy, tôi có ấn tượng rằng nó đã thêm vào 'base-config' và không thay thế nó hoàn toàn?
mbonnin

Oh bạn nói đúng. Bạn không cần phải liệt kê rõ ràng các neo tin cậy "hệ thống" trong ghi đè gỡ lỗi.
Alex Klyubin

4
Câu trả lời này không rõ ràng. Hãy tham khảo câu trả lời của @ stkent dưới đây.
Adam Hurwitz

4
Đồng ý câu trả lời này giải thích những gì đang xảy ra nhưng rất không rõ ràng những bước người ta nên làm.
StarWind0

114

Giải pháp là không sử dụng .p12 , chỉ cần điều hướng bằng Chrome (với proxy được định cấu hình trên wifi) đến http://charlesproxy.com/getsslcài đặt tệp .pem đã tải xuống .

Tôi cũng gặp phải vấn đề tương tự trên Nexus 5X chạy Android 7.0. Trước đó đã có tệp .p12 được xuất từ ​​Charles 3.11.5 (Trợ giúp-> SSL Proxying-> Xuất chứng chỉ gốc Charles và Khóa cá nhân). Khi tôi cố gắng cài đặt .p12 từ điện thoại (Cài đặt-> Bảo mật-> Cài đặt từ bộ nhớ), nó chỉ xuất hiện trong "Thông tin đăng nhập người dùng" chứ không bao giờ xuất hiện ở "Thông tin đăng nhập đáng tin cậy" và tất nhiên SSL với proxy Charles không hoạt động.

Tổng số "hướng dẫn" cho Android 7.0 sẽ như sau:

  1. Định cấu hình WiFi + proxy (cách Charles yêu cầu). Kết nối nó.
  2. Trên thiết bị, điều hướng bằng Chrome đến http://charlesproxy.com/getssl , chấp nhận yêu cầu tải xuống .pem, sau đó nhấn "mở", ứng dụng này sẽ khởi chạy ứng dụng "Trình cài đặt chứng chỉ". Sử dụng nó để cài đặt chứng chỉ dưới dạng "VPN và ứng dụng".
  3. Đặt thuộc tính android:networkSecurityConfig="@xml/network_security_config"để <application>tại manifest.xml
  4. Tạo res / xml / network_security_config.xml với nội dung từ bài viết đầu tiên (nó hoàn toàn chính xác).
  5. Khởi chạy Charles và ứng dụng và vui chơi.

PS Kiểm tra ngày / giờ trên thiết bị. Nó phải là chính xác.


2
Một lưu ý quan trọng về câu trả lời tuyệt vời này: nếu ứng dụng của bạn đang nhắm mục tiêu API 23 trở xuống, bạn không cần bước 3 và 4. Trên thực tế, bạn sẽ không thể biên dịch nội dung cấu hình bảo mật mạng nếu bạn có API 23 hoặc thấp hơn.
David Ferrand

1
Đây là một giải pháp tuyệt vời cho Android 7.0. Rõ ràng hơn nhiều so với thông tin chính thức của Charles Proxy.
Adam Link

3
Có thể chỉ tôi nhưng các bước này không còn hiệu quả với tôi trong 7.1.1. Gần đây tôi đã cập nhật
satyajit 10/02/17

@satyajit Giải pháp này phù hợp với tôi trên Android 7.1.1 trên Google Pixel.
Dick Lucas

có hoặc không có bước 3 và 4?
satyajit

-1

Tôi đang sử dụng Android 7.1.1, đây là cách tôi thiết lập trên thiết bị của mình (OnePlus One) - mà không cần thay đổi tệp kê khai (tôi đã nhắm mục tiêu API 21 cho ứng dụng của mình):

Trong Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Bước này cung cấp cho bạn IP proxy và số cổng cũng như liên kết đến nơi bạn nên tải xuống charles proxy SSL.

Trên điện thoại của bạn:

  1. Wifi Settings > Modify Network > Advanced Options. Đặt Proxy thành Manualvà nhập số IP và Cổng mà bạn nhận được từ Charles vào Proxy hostnamevà nhập Proxy porttương ứng.

  2. (TÙY CHỌN) Bạn có thể truy cập hoặc không thể truy cập liên kết chls.pro/ssl do Charles cung cấp trước đó. Trên thiết bị của tôi, tôi luôn được thông báo rằng tôi không có kết nối mạng. Tôi đã thêm charlesproxy.com vào Bypass proxy fortrường.

  3. Trên trình duyệt của bạn, hãy truy cập liên kết ở bước 3 và tải xuống bất kỳ chứng chỉ nào cần thiết (nếu nó không hoạt động trên Chrome, hãy tải xuống Trình duyệt Dolphin). Bạn có thể đặt tên chứng chỉ của mình bằng bất kỳ tên nào.

Quay lại Charles Proxy:

  1. Bạn sẽ nhận được lời nhắc đến một trong hai Allowhoặc Denyđiện thoại của mình sử dụng proxy nếu cài đặt của bạn được đặt mặc định để nhắc bạn kết nối từ xa.

Bây giờ bạn có thể sử dụng Charles trên Nougat 7.1.1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.