samopodpisana instalacja certyfikatu twierdzi, że zakończyła się sukcesem, ale Android działa tak, jakby certyfikatu nie było

17

Próbuję zainstalować samopodpisany certyfikat dla mojego serwera internetowego w systemie Android 4.3. Mam plik .crt w katalogu głównym karty SD (który jest w rzeczywistości emulowany, ponieważ nie mam karty SD w gnieździe).

Aby zainstalować certyfikat, przejdź do Ustawienia -> Ogólne -> Bezpieczeństwo -> Pamięć poświadczeń -> Zainstaluj z pamięci urządzenia.

Dostaję okno dialogowe z nazwą certyfikatu (nazwa pliku minus rozszerzenie .crt), którą mogę modyfikować (ale nie zmieniam), „używane do” rozwijania z zaznaczoną „VPN i aplikacje” i tekstem na dole okna dialogowego informującego „Pakiet zawiera: jeden certyfikat użytkownika”. Wszystko wygląda dobrze, więc klikam „Ok”. Okno dialogowe zniknie i pojawi się komunikat „Toast” z zainstalowanym „[name]”.

Jeśli jednak od razu przejdę do „Zaufanych danych logowania i wybiorę„ Użytkownika ”, nic tam nie ma! Nowy certyfikat również nie znajduje się w„ Systemie ”, ale nie spodziewałbym się tego. Jeśli przejdę do przeglądarki i spróbuję przejść do mojego strony internetowej, wciąż pojawia się ostrzeżenie, że certyfikat tej witryny nie jest zaufany. Próbowałem też zrestartować komputer, ale to nie robi różnicy.

Co ja robię źle? Całkowity brak komunikatów o błędach nie jest pomocny. Czy to możliwe, że mój certyfikat ma niewłaściwy format? Próbowałem użyć pliku .crt w katalogu ssl serwera i próbowałem przekonwertować go do formatu DER.

Aktualizacja: przeczytałem gdzieś, że Android wymaga certyfikatów w formacie p12, więc przekonwertowałem certyfikat Apache2 na p12 za pomocą następującego polecenia:

openssl pkcs12 -export -inkey server.key -in server.crt -out ~/server.p12

Następnie powtórzyłem powyższe kroki, otrzymałem ten sam komunikat o powodzeniu, a następnie nadal nie widziałem certyfikatu w poświadczeniach użytkownika i nadal otrzymuję błąd niezaufanego certyfikatu z przeglądarki mobilnej.

Michael
źródło

Odpowiedzi:

19

Miałem ten sam problem z tym, że Android naprawdę zainstalował certyfikat, dopóki nie znalazłem tej witryny, która opisuje metodę, która działała dla mnie. Sprowadza się do następujących kroków:

  1. Utwórz klucz prywatny i publiczny certyfikat x509 z rozszerzeniami v3_req i włączony jako urząd certyfikacji:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/my_site.key -out /etc/ssl/certs/my_site.crt -reqexts v3_req -extensions v3_ca

  2. Konwertuj certyfikat na format DER, który jest zrozumiały dla Androida:

    sudo openssl x509 -in /etc/ssl/certs/my_site.crt -outform der -out my_site.der.crt

  3. Użyj dowolnej metody, aby dostać się my_site.der.crtna swoje urządzenie z Androidem - z łatwością mogłem hostować plik na moim serwerze internetowym i pobierać go za pośrednictwem przeglądarki Androida, która następnie automatycznie pozwala go zainstalować.

Chociaż wolałbym, aby krok 1 został podzielony na dwa (1a. Generowanie klucza prywatnego i 1b. Generacja certyfikatu publicznego), nie zainwestowałem zbyt wiele czasu w badanie, jak to zrobić. Daj mi znać w komentarzu, jeśli znalazłeś sposób, który działa, dzięki.

(Zamiast dodawać komentarz, wydaje mi się, że to naprawdę należy do odpowiedzi w przyszłości, więc edytuję go. - Michael)

Zamiast tworzyć certyfikat włączony jako urząd certyfikacji, utworzyłem samopodpisany urząd certyfikacji, a następnie ponownie podpisałem mój istniejący klucz / csr nowym urzędem certyfikacji. Następnie dodałem samopodpisany urząd certyfikacji do Androida i voila! Zadziałało!

Generowanie samopodpisanego urzędu certyfikacji:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem

Ponowne podpisanie istniejącego CSR, który miałem po utworzeniu klucza z

openssl x509 -req -in existing.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out existing.crt -days 3649

Teraz używając zmodyfikowanej formy drugiego polecenia przekonwertowałem certyfikat CA na formularz DER:

openssl x509 -in /etc/apache2/ssl/rootCA.pem -outform der -out ~/rootCA.der.crt

Wspaniałą rzeczą jest to, że wszelkie dodatkowe niezaufane certyfikaty, które są teraz ponownie podpisywane za pomocą nowego samopodpisanego urzędu certyfikacji, będą teraz zaufane na dowolnym urządzeniu niż ma zainstalowany nowy urząd certyfikacji bez potrzeby instalowania czegokolwiek innego. Nie rozwiązuje to dokładnie problemu polegającego na zaufaniu stronom, nad którymi nie masz kontroli, ale może to ułatwić, jeśli masz wpływ (powiedzmy) na dział IT dla wewnętrznego serwera lub czegoś takiego.

FriendFX
źródło
1
Mam już certyfikat, który muszę zainstalować, więc wypróbowałem krok 2 i nadal nie pojawia się on w Zaufanych poświadczeniach użytkownika po tym, jak twierdzi, że instalacja zakończyła się powodzeniem, a Chrome po ponownym uruchomieniu wyświetla błąd „niezaufana witryna”.
Michael
1
Czy może być coś w rozszerzeniu v3_req i włączonym jako urząd certyfikacji, które musi posiadać certyfikat, aby Android mógł z niego korzystać? Jeśli tak, czy istnieje polecenie, którego mogę użyć, aby pobrać istniejący certyfikat i dodać do niego te informacje, ponieważ nie mam kontroli nad wszystkimi certyfikatami, które chcę zainstalować.
Michael
3
Aby odpowiedzieć na pierwszą część mojego poprzedniego pytania, przeczytałem połączoną stronę i wydaje się, że problem polega na tym, że Android odmawia instalacji samopodpisanych certyfikatów (ale nie samopodpisanych urzędów certyfikacji). Wydaje się to nieudokumentowane, a fakt, że Android udaje, że się instaluje, jeszcze gorzej. Pozostaje jednak pytanie, czy jeśli mam samopodpisany certyfikat, nad którym nie mam kontroli, czy jest jakiś sposób na „CA”, aby go zainstalować?
Michael
1
@ Mam nadzieję, że nie masz nic przeciwko, zamierzam edytować twoją odpowiedź, aby uwzględnić moje rozwiązanie, zamiast uwzględniać je w komentarzach, ponieważ tak naprawdę należy ono do odpowiedzi.
Michael
1
Nie rozumiem, jak generowane jest istniejące żądanie podpisania .csr. Myślę, że to ostatni brakujący punkt kompletnego samouczka krok po kroku.
cuenther