Jak zainstalować zaufany certyfikat CA na urządzeniu z Androidem?

136

Utworzyłem własny certyfikat CA i chcę go teraz zainstalować na moim urządzeniu z Androidem Froyo (HTC Desire Z), aby urządzenie zaufało mojemu certyfikatowi.

Android przechowuje certyfikaty CA w swoim magazynie kluczy Java w formacie /system/etc/security/cacerts.bks. Skopiowałem plik na swój komputer, dodałem certyfikat za pomocą Portecle 1.5 i wrzuciłem go z powrotem do urządzenia.

Teraz wydaje się, że Android nie ładuje ponownie pliku automatycznie. Przeczytałem w kilku postach na blogu, że muszę ponownie uruchomić urządzenie. Powoduje to ponowne nadpisanie pliku oryginalnym.

Następną moją próbą było zainstalowanie certyfikatu z karty SD poprzez skopiowanie go i użycie odpowiedniej opcji z menu ustawień. Urządzenie informuje mnie, że certyfikat został zainstalowany, ale najwyraźniej nie ufa certyfikatowi. Co więcej, kiedy próbuję skopiować magazyn kluczy na mój komputer, nadal znajduję oryginalny zapas cacerts.bks.

Jaki jest więc właściwy sposób zainstalowania własnego certyfikatu głównego urzędu certyfikacji na urządzeniu z systemem Android 2.2 jako zaufanego certyfikatu? Czy istnieje sposób na zrobienie tego programowo?

Björn Marschollek
źródło
Tutaj możesz założyć zrootowany telefon. :)
Björn Marschollek,

Odpowiedzi:

122

Przed Androidem KitKat musisz zrootować swoje urządzenie, aby zainstalować nowe certyfikaty.

Od Androida KitKat (4.0) do Nougat (7.0) jest to możliwe i łatwe. Udało mi się zainstalować certyfikat Charles Web Debbuging Proxy na moim niezrootowanym urządzeniu i pomyślnie wykryć ruch SSL.

Wyciąg z http://wiki.cacert.org/FAQ/ImportRootCert

Przed wersją Androida 4.0, z wersją Androida Gingerbread & Froyo, istniał jeden plik tylko do odczytu (/system/etc/security/cacerts.bks) zawierający magazyn zaufania ze wszystkimi certyfikatami CA („systemowymi”) zaufanymi domyślnie Android. Korzystają z tego zarówno aplikacje systemowe, jak i wszystkie aplikacje opracowane za pomocą zestawu Android SDK. Skorzystaj z tych instrukcji dotyczących instalowania certyfikatów CAcert na urządzeniach z Androidem Gingerbread, Froyo, ...

Począwszy od Androida 4.0 (Android ICS / „Ice Cream Sandwich”, Android 4.3 „Jelly Bean” i Android 4.4 „KitKat”) zaufane certyfikaty systemu znajdują się na (tylko do odczytu) partycji systemowej w folderze „/ system / etc /” security / ”jako pojedyncze pliki. Jednak użytkownicy mogą teraz łatwo dodawać własne certyfikaty „użytkownika”, które będą przechowywane w „/ data / misc / keychain / certs-added”.

Certyfikatami zainstalowanymi w systemie można zarządzać na urządzeniu z systemem Android w sekcji Ustawienia -> Bezpieczeństwo -> Certyfikaty -> „System”, podczas gdy zaufane certyfikaty użytkowników można zmieniać w sekcji „Użytkownik”. Korzystając z zaufanych certyfikatów użytkownika, system Android zmusi użytkownika urządzenia z systemem Android do wdrożenia dodatkowych środków bezpieczeństwa: użycie kodu PIN, blokady wzoru lub hasła do odblokowania urządzenia jest obowiązkowe, gdy używane są certyfikaty dostarczone przez użytkownika.

Instalowanie certyfikatów CAcert jako certyfikatów „zaufanych użytkownikom” jest bardzo łatwe. Instalowanie nowych certyfikatów jako certyfikatów „zaufanych w systemie” wymaga więcej pracy (i wymaga uprawnień administratora), ale ma tę zaletę, że pozwala uniknąć wymogu blokady ekranu Androida.

Począwszy od Androida N staje się to trudniejsze, zobacz ten fragment z witryny Charles proxy :

Począwszy od Androida N, musisz dodać konfigurację do swojej aplikacji, aby ufała certyfikatom SSL generowanym przez Charles SSL Proxying. Oznacza to, że możesz używać proxy SSL tylko z aplikacjami, które kontrolujesz.

Aby skonfigurować aplikację, aby ufała Charles, musisz dodać do niej plik konfiguracji zabezpieczeń sieci. Ten plik może zastąpić domyślne ustawienie systemowe, umożliwiając aplikacji zaufanie certyfikatów CA zainstalowanych przez użytkownika (np. Certyfikat Charles Root). Możesz określić, że ma to zastosowanie tylko w kompilacjach debugowania aplikacji, tak aby kompilacje produkcyjne używały domyślnego profilu zaufania.

Dodaj plik res / xml / network_security_config.xml do swojej aplikacji:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Następnie dodaj odwołanie do tego pliku w manifeście aplikacji w następujący sposób:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>
Dean Wild
źródło
1
Moje niestandardowe pliki certyfikatów ( /system/etc/security/cacerts/*.0) nie są zachowywane po ponownym uruchomieniu / ponownym uruchomieniu AVD, więc to rozwiązanie nie powiodło się.
fikr4n
@BornToCode ciekawe - rzadko używam AVD jest tak, że nie był świadomy tego ograniczenia
Dean Dziki
Widzę ustawienie debug-overrides, czy to oznacza, że ​​jest to network_security_configtylko wariant przeznaczony do debugowania? Jeśli mam inny wariant, taki jak wariant UAT, to nie zadziała?
Izaak
1
@Isaac oznacza to, że będzie dotyczyło wszystkich wariantów, w których debuggable = true
Dean Wild
1
@DeanWild - bardzo dziękuję! Próbowałem, aby to działało wiecznie i podczas debugowania mojej aplikacji ciągle otrzymywałem „nieprawidłowy certyfikat ssl”. To rozwiązanie zadziałało jak urok dla mojej aplikacji na Androida działającej na Androidzie 9 na Samsung Note 8.
Dave Black
43

Spędziłem dużo czasu, próbując znaleźć odpowiedź na to pytanie (potrzebuję Androida, aby zobaczyć certyfikaty StartSSL). Wniosek: Android 2.1 i 2.2 umożliwia importowanie certyfikatów, ale tylko do użytku z Wi-Fi i VPN. Nie ma interfejsu użytkownika do aktualizowania listy zaufanych certyfikatów głównych, ale istnieje dyskusja na temat dodawania tej funkcji. Nie jest jasne, czy istnieje niezawodne obejście ręcznej aktualizacji i zamiany pliku cacerts.bks.

Szczegóły i linki: http://www.mcbsys.com/techblog/2010/12/android-certificates/ . W tym poście zobacz link do błędu Androida 11231 - możesz dodać swój głos i zapytanie do tego błędu.

Mark Berry
źródło
3
Programista Android odpowiedział na moje pytanie dotyczące. aktualizacja cacerts.bks: „we wszystkich wersjach 2.3, do aktualizacji cacerts.bks na telefonie bez rootowania wymagana jest OTA”. code.google.com/p/android/issues/detail?id=11231#c25 . OTA = over-the-air, prawda? Czy to może być powód, dla którego Twój telefon powraca do fabrycznego cacerts.bks? Jeśli jednak masz uprawnienia administratora, wydaje się, że powinieneś być w stanie pobrać kod źródłowy, dodać swój certyfikat, a następnie zbudować cacerts.bks za pomocą skryptu certimport.sh. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry
Dzięki. Oczywiście nie była to odpowiedź, którą chciałem usłyszeć, ale wydaje się, że jest to właściwa odpowiedź. Miałem nadzieję, że jest sposób na zainstalowanie certyfikatu bez aktualizacji całego systemu. Mogę oczywiście zbudować nowy cacerts.bks, z dostępem do roota mogę nawet zastąpić stary, ale przywraca on oryginalną wersję przy każdym ponownym uruchomieniu. Wydaje się, że bez ponownego uruchamiania systemu Android odmawia ponownego załadowania pliku zaufanych certyfikatów.
Björn Marschollek
27
A co z instalacją certyfikatów CA na platformach 3.X i 4.X?
Alok Kulkarni
16

Jeśli potrzebujesz certyfikatu do połączeń HTTPS, możesz dodać plik .bks jako surowe zasoby do swojej aplikacji i rozszerzyć DefaultHttpConnection, aby Twoje certyfikaty były używane do połączeń HTTPS.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}
Alexander Egger
źródło
Dzięki za odpowiedź. Właściwie muszę zainstalować certyfikat w taki sposób, aby każda aplikacja na urządzeniu ufała certyfikatowi. Ten sam problem powinien również występować w przypadku niektórych mniejszych urzędów certyfikacji, takich jak CAcert, których certyfikaty nie są domyślnie zaufane. Jak instalują swoje certyfikaty?
Björn Marschollek,
Czy próbowałeś: Ustawienia -> Bezpieczeństwo -> Zainstaluj z karty SD
Alexander Egger,
To też może być interesujące: android.git.kernel.org/?p=platform/packages/apps/ ...
Alexander Egger,
2
Mam ten sam problem, muszę załadować certyfikat .PDX X509 za pomocą aplikacji Adroid 2.3.3, a następnie utworzyć połączenie SSL. Czy ktoś może mi pomóc w skomentowanym kodzie?
AndroidLearner,
9

Przewodnik, do którego link znajduje się tutaj , prawdopodobnie odpowie na pierwotne pytanie bez konieczności programowania niestandardowego konektora SSL.

Znalazłem bardzo szczegółowy przewodnik dotyczący importowania certyfikatów głównych, który faktycznie prowadzi Cię przez instalację zaufanych certyfikatów CA na różnych wersjach urządzeń z Androidem (między innymi).

Zasadniczo musisz:

  1. Pobierz: plik cacerts.bks z telefonu.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Pobierz plik .crt z urzędu certyfikacji, któremu chcesz zezwolić.

  3. Zmodyfikuj plik cacerts.bks na komputerze za pomocą dostawcy BouncyCastle

  4. Prześlij plik cacerts.bks z powrotem do telefonu i uruchom ponownie.

Oto bardziej szczegółowy opis krok po kroku aktualizacji starszych telefonów z systemem Android: Jak zaktualizować magazyn kluczy urzędu certyfikacji bezpieczeństwa HTTPS na urządzeniu z systemem starszym niż Android 4.0

RightHandedMonkey
źródło
5

Jest na to DUŻO łatwiejsze rozwiązanie niż zamieszczone tutaj lub w powiązanych wątkach. Jeśli używasz widoku internetowego (tak jak ja), możesz to osiągnąć, wykonując w nim funkcję JAVASCRIPT. Jeśli nie używasz widoku internetowego, możesz chcieć utworzyć w tym celu ukryty. Oto funkcja, która działa w prawie każdej przeglądarce (lub widoku internetowym), aby rozpocząć instalację (zwykle za pośrednictwem udostępnionego repozytorium certyfikatów systemu operacyjnego, w tym na Droidzie). Używa fajnej sztuczki z iFrame. Po prostu przekaż adres URL do pliku .crt do tej funkcji:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

AKTUALIZACJA:

Sztuczka iframe działa na Droidach z interfejsem API 19 i nowszym, ale starsze wersje widoku internetowego nie będą działać w ten sposób. Jednak ogólny pomysł nadal działa - po prostu pobierz / otwórz plik za pomocą przeglądarki internetowej, a następnie pozwól systemowi operacyjnemu przejąć kontrolę. Może to być łatwiejsze i bardziej uniwersalne rozwiązanie (teraz w rzeczywistej Javie):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Zauważ, że instancja_ jest odniesieniem do działania. Działa to doskonale, jeśli znasz adres URL do cert. Jednak w moim przypadku rozwiązuję to dynamicznie za pomocą oprogramowania po stronie serwera. Musiałem dodać sporo dodatkowego kodu, aby przechwycić adres URL przekierowania i wywołać go w sposób, który nie spowodował awarii w oparciu o komplikacje związane z wątkami, ale nie dodam tutaj całego zamieszania ...

BuvinJ
źródło
3

To, co zrobiłem, aby móc korzystać z certyfikatów startssl, było dość łatwe. (na moim zrootowanym telefonie)

Skopiowałem /system/etc/security/cacerts.bks na moją kartę SD

Pobrano http://www.startssl.com/certs/ca.crt i http://www.startssl.com/certs/sub.class1.server.ca.crt

Poszedłem na portecle.sourceforge.net i uruchomiłem portecle bezpośrednio ze strony internetowej.

Otworzyłem plik cacerts.bks z mojej karty SD (nic nie wpisałem, gdy pojawiło się pytanie o hasło)

Wybierz import w portacle i otwórz sub.class1.server.ca.crt, w moim przypadku już miał ca.crt, ale może też musisz go zainstalować.

Zapisałem magazyn kluczy i skopiowałem go baxck do /system/etc/security/cacerts.bks (najpierw wykonałem kopię zapasową tego pliku na wszelki wypadek)

Zrestartowałem telefon i teraz mogę przeglądać moją witrynę, używając certyfikatu startssl bez błędów.

hans
źródło
masz jakiś pomysł, jak umieścić cacert.bks z powrotem na urządzeniu niezrootowanym?
Bob
2

Te kroki zadziałały dla mnie:

  1. Zainstaluj aplikację Dory Certificate na Androida na swoim urządzeniu mobilnym: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. Podłącz urządzenie mobilne do laptopa za pomocą kabla USB.
  3. Utwórz folder główny w wewnętrznej pamięci telefonu, skopiuj plik certyfikatu do tego folderu i odłącz kabel.
  4. Otwórz aplikację Dory Certificate na Androida, kliknij okrągły przycisk [+] i wybierz odpowiednią opcję Importuj certyfikat pliku.
  5. Wybierz format, podaj nazwę (wpisałem taką samą jak nazwa pliku), przejrzyj plik certyfikatu i kliknij [OK].
  6. Pojawią się trzy karty. Zignorowałem kartę, na której był tylko przycisk [SIGN CSR], i kliknąłem przycisk [INSTALL] na dwóch pozostałych kartach.
  7. Odświeżyłem aplikację internetową PWA, którą otworzyłem, nie mam mobilnej przeglądarki Chrome (jest hostowana na lokalnym serwerze internetowym IIS) i voala! Brak ostrzeżenia o Chrome. Był tam zielony zamek. To działało.

Alternatywnie znalazłem te opcje, których nie musiałem próbować samodzielnie, ale wyglądały na łatwe do naśladowania:

Wreszcie, może to nie być istotne, ale jeśli chcesz utworzyć i skonfigurować certyfikat z podpisem własnym (z mkcert) dla swojej aplikacji PWA (witryny sieci Web) hostowanej na lokalnym serwerze sieci Web IIS, poszedłem na tę stronę:

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

Dzięki i mam nadzieję, że to pomoże! :)

Manuel Hernandez
źródło
1

Oto alternatywne rozwiązanie, które faktycznie dodaje Twój certyfikat do wbudowanej listy domyślnych certyfikatów: Ufanie wszystkim certyfikatom przy użyciu HttpClient przez HTTPS

Jednak będzie działać tylko w przypadku Twojej aplikacji. Nie ma możliwości programowego zrobienia tego dla wszystkich aplikacji na urządzeniu użytkownika, ponieważ stanowiłoby to zagrożenie bezpieczeństwa.

emmby
źródło