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 pfx
certyfikat z Settings -> Security -> Install from storage
. Certyfikat jest widoczny, User Credentials
ale 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?
android
ssl
android-7.0-nougat
mbonnin
źródło
źródło
user
folderu<base-config>
i zobaczyć, czy to się zmieni. Nie powinno, ale próba zajmie tylko chwilę.Settings -> Security -> Install from storage
Odpowiedzi:
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:
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.
Android Nougat zmiana w zachowaniu
Settings -> Security -> Install from storage
przepł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 storage
przepł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 storage
nie 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 rezultacieSettings -> Security -> Install from storage
przepł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.
źródło
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?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:
android:networkSecurityConfig="@xml/network_security_config"
aby<application>
w manifest.xmlPS Sprawdź datę / godzinę w urządzeniu. Powinno być poprawne.
źródło
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:
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:
Wifi Settings > Modify Network > Advanced Options
. Ustaw Proxy naManual
i wprowadź adres IP i numer portu otrzymane od Charlesa odpowiednio doProxy hostname
iProxy port
.(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 for
pola.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:
Allow
lubDeny
telefon 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.
źródło