Jak sprawić, by serwer proxy Charlesa działał z systemem Android 7 Nougat?

101

Android 7 wprowadził pewne zmiany w sposobie obsługi certyfikatów ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) i jakoś nie mogę już uruchomić mojego proxy Charlesa.

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

Pracuję w trybie debugowania. Ale bez względu na wszystko, rozumiem javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Nie trzeba dodawać, że zainstalowałem pfxcertyfikat z Settings -> Security -> Install from storage. Certyfikat jest widoczny, User Credentialsale nie Trusted credentials -> User. Na moim urządzeniu Lollipop są tam wymienione certyfikaty.

Używam okhttp3 jako biblioteki HTTP.

Masz pojęcie, co robię źle?

mbonnin
źródło
1
W ramach szybkiego testu spróbuj dodać / przenieść go do userfolderu <base-config>i zobaczyć, czy to się zmieni. Nie powinno, ale próba zajmie tylko chwilę.
CommonsWare
Czy nie musiałbyś dodawać jawnego urzędu certyfikacji dla Charlesa w developer.android.com/training/articles/security-config.html : „Trusting Additional CAs”, ponieważ Charles CA jest samodzielnie wygenerowany i nie byłby w Łańcuch zaufania systemu Android?
Morrison Chang
@Morisson Chang: Nie chcę osadzać Charles CA w aplikacji, chcę mieć możliwość ręcznego dodania go na moim telefonie deweloperskim, tak jak robiłem to kiedyś. OdSettings -> Security -> Install from storage
mbonnin
1. W jaki sposób odwołujesz się do pliku network_security_config.xml w pliku AndroidManifest.xml Twojej aplikacji? 2. Czy mógłbyś połączyć plik .pfx? Przypuszczam, że zawiera on tylko certyfikat CA (bez kluczy prywatnych) i dlatego powinien być opublikowany. Pytam, ponieważ jeśli .pfx zawiera klucz prywatny, zakłada się, że jest to plik certyfikatu klienta, a zatem CA z pliku nie zostanie zainstalowany jako zaufany do uwierzytelniania serwera.
Alex Klyubin
1
@AlexKlyubin hurra, już działa :). Myślę, że musiałem zrestartować moje Charles, aplikację lub cokolwiek innego. Byłem zdezorientowany, ponieważ zainstalowałem ten sam plik .pfx na niezliczonych urządzeniach z Androidem przed nougatem i zostały one rozpoznane w porządku. Ale teraz wszystko jest w porządku. Czy mógłbyś napisać odpowiedź, abym mógł ją zatwierdzić?
mbonnin

Odpowiedzi:

26

Opierając się na wątku rozwiązywania problemów z komentarzami do OP, odpowiedzią jest zainstalowanie tylko certyfikatu CA proxy jako zaufanego, a nie jego certyfikatu + klucz prywatny.

Problem był spowodowany dwoma czynnikami:

  1. Instalowanie nie tylko certyfikatu CA serwera proxy MiTM, ale także jego klucza prywatnego (w ten sposób umożliwiając aplikacjom VPN na urządzeniu odszyfrowywanie / ruch sieciowy MiTM z innych aplikacji). Nie potrzebujesz klucza prywatnego serwera proxy MiTM na urządzeniu.

  2. Android Nougat zmiana w zachowaniu Settings -> Security -> Install from storageprzepływu plików, które zawierają klucz prywatny oprócz certyfikatów. Ta zmiana w zachowaniu zdemaskowała powyższy problem.

Przed Nougatem Settings -> Security -> Install from storageprzepływ plików zawierających klucz prywatny oprócz certyfikatów błędnie instalował certyfikaty jako zaufane do uwierzytelniania serwera (np. HTTPS, TLS, dzięki czemu Twój MiTM odniósł sukces), oprócz tego, że został poprawnie zainstalowany jako certyfikaty klienta używane do uwierzytelnianie tego urządzenia z systemem Android na serwerach. W Nougat błąd został naprawiony i te certyfikaty nie są już instalowane jako zaufane do uwierzytelniania serwera. Zapobiega to wpływaniu (osłabianiu) bezpieczeństwa połączeń z serwerami przez poświadczenia uwierzytelniania klienta. W Twoim scenariuszu uniemożliwia to sukces Twojego MiTM.

Sprawy komplikuje fakt, że Settings -> Security -> Install from storagenie zapewnia on jednoznacznego sposobu, aby użytkownik mógł określić, czy instaluje dane uwierzytelniające klienta (klucz prywatny + łańcuch certyfikatów), czy kotwicę zaufania uwierzytelniania serwera (tylko certyfikat CA - klucz prywatny nie jest potrzebny) . W rezultacie Settings -> Security -> Install from storageprzepływ zgaduje, czy ma do czynienia z danymi uwierzytelniającymi klienta / użytkownika, czy kotwicą zaufania uwierzytelniania serwera, przyjmując, że jeśli określono klucz prywatny, musi to być poświadczenie uwierzytelniania klienta / użytkownika. W twoim przypadku błędnie założono, że instalujesz poświadczenie uwierzytelniania klienta / użytkownika, a nie kotwicę zaufania uwierzytelniania serwera.

PS Jeśli chodzi o konfigurację zabezpieczeń sieci, prawdopodobnie powinieneś skonfigurować aplikację tak, aby ufała także „systemowym” kotwicom zaufania w trybie debugowania (sekcja debug-overrides). W przeciwnym razie kompilacje aplikacji do debugowania nie będą działać, chyba że połączenia są przekazywane przez serwer proxy, którego certyfikat CA jest zainstalowany jako zaufany na urządzeniu z systemem Android.

Alex Klyubin
źródło
1
Odnośnie PS: mówi dokumentacja Trust anchors specified in debug-overrides are added to all other configurations. Miałem więc wrażenie, że dodał do 'base-config' i nie zastąpił go całkowicie?
mbonnin
Och, masz rację. Nie musisz jawnie wymieniać kotwic zaufania „systemowych” w nadpisywaniu debugowania.
Alex Klyubin
4
Ta odpowiedź jest niejasna. Proszę zapoznać się z odpowiedzią @ stkent poniżej.
Adam Hurwitz
4
Zgadzam się, ta odpowiedź wyjaśnia, co się dzieje, ale jest bardzo niejasne, jakie kroki należy zrobić.
StarWind0,
114

Rozwiązaniem jest nie używanie .p12 , po prostu przejdź w Chrome (ze skonfigurowanym proxy na Wi-Fi) do http://charlesproxy.com/getssl i zainstaluj pobrany plik .pem .

Dokładnie ten sam problem miałem na moim Nexusie 5X z systemem Android 7.0. Wcześniej wyeksportowano plik .p12 z Charlesa 3.11.5 (Pomoc-> SSL Proxying-> Eksportuj certyfikat Charles Root i klucz prywatny). Kiedy próbowałem zainstalować .p12 z telefonu (Ustawienia-> Zabezpieczenia-> Instaluj z pamięci) pojawia się on tylko w „Poświadczeniach użytkownika”, a nigdy w „Zaufanych poświadczeniach” i oczywiście SSL z proxy Charlesa nie działa.

Całkowite „instrukcje” dla Androida 7.0 wyglądałyby tak:

  1. Skonfiguruj Wi-Fi + proxy (tak jak wymaga tego Charles). Podłącz to.
  2. Na urządzeniu przejdź w Chrome do http://charlesproxy.com/getssl , zaakceptuj żądanie pobrania .pem, a następnie naciśnij „otwórz”, aby uruchomić aplikację „Instalator certyfikatu”. Użyj go, aby zainstalować certyfikat jako „VPN i aplikacje”.
  3. Umieścić atrybut android:networkSecurityConfig="@xml/network_security_config"aby <application>w manifest.xml
  4. Utwórz plik res / xml / network_security_config.xml z treścią z pierwszego postu (jest to całkowicie poprawne).
  5. Uruchom aplikację Charles i baw się dobrze.

PS Sprawdź datę / godzinę w urządzeniu. Powinno być poprawne.

Alexander Skvortsov
źródło
2
Ważna uwaga na temat tej wspaniałej odpowiedzi: jeśli Twoja aplikacja jest przeznaczona dla API 23 lub niższego, nie potrzebujesz kroków 3 i 4. W rzeczywistości nie będziesz w stanie skompilować elementów konfiguracji sieciowej, jeśli masz API 23 lub niżej.
David Ferrand
1
To świetne rozwiązanie dla Androida 7.0. Znacznie jaśniejsze niż oficjalne informacje Charles Proxy.
Adam Link
3
Prawdopodobnie tylko ja, ale te kroki już nie działają dla mnie w 7.1.1. Niedawno zrobiłem aktualizację
satyajit
@satyajit To rozwiązanie działa u mnie na Androidzie 7.1.1 na Google Pixel.
Dick Lucas,
z krokami 3 i 4 czy bez nich?
satyajit
-1

Jestem na Androidzie 7.1.1, oto jak konfiguruję na moim urządzeniu (OnePlus One) - bez zmiany manifestu (celowałem w API 21 dla mojej aplikacji):

W Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. W tym kroku uzyskasz adres IP serwera proxy i numer portu, a także łącze do miejsca, w którym należy pobrać serwer proxy SSL z serwera Charles.

Na Twoim telefonie:

  1. Wifi Settings > Modify Network > Advanced Options. Ustaw Proxy na Manuali wprowadź adres IP i numer portu otrzymane od Charlesa odpowiednio do Proxy hostnamei Proxy port.

  2. (OPCJONALNIE) Możesz mieć dostęp do linku chls.pro/ssl dostarczonego wcześniej przez Charlesa lub nie . Na moim urządzeniu zawsze otrzymywałem informację, że nie mam połączenia sieciowego. Dodałem charlesproxy.com do Bypass proxy forpola.

  3. W przeglądarce przejdź do łącza w kroku 3 i pobierz wymagany certyfikat (jeśli nie działa w przeglądarce Chrome, pobierz przeglądarkę Dolphin). Możesz nazwać swój certyfikat dowolną nazwą.

Wracając do Charles Proxy:

  1. Powinieneś dostać zachęty do jednej Allowlub Denytelefon do korzystania z serwera proxy, jeśli ustawienia są domyślnie monit dla połączeń zdalnych.

Możesz teraz używać Charlesa na Nougat 7.1.1.

Muślin
źródło