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?
źródło
Odpowiedzi:
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
Począwszy od Androida N staje się to trudniejsze, zobacz ten fragment z witryny Charles proxy :
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>
źródło
/system/etc/security/cacerts/*.0
) nie są zachowywane po ponownym uruchomieniu / ponownym uruchomieniu AVD, więc to rozwiązanie nie powiodło się.debug-overrides
, czy to oznacza, że jest tonetwork_security_config
tylko wariant przeznaczony do debugowania? Jeśli mam inny wariant, taki jak wariant UAT, to nie zadziała?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.
źródło
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); } } }
źródło
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:
Pobierz: plik cacerts.bks z telefonu.
adb pull /system/etc/security/cacerts.bks cacerts.bks
Pobierz plik .crt z urzędu certyfikacji, któremu chcesz zezwolić.
Zmodyfikuj plik cacerts.bks na komputerze za pomocą dostawcy BouncyCastle
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
źródło
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 ...
źródło
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.
źródło
Te kroki zadziałały dla mnie:
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! :)
źródło
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.
źródło
Jeśli masz zrootowane urządzenie, możesz użyć modułu Magisk, aby przenieść certyfikaty użytkownika do systemu, aby był to zaufany certyfikat
https://github.com/yochananmarqos/Move-Certificates
źródło