2014-07-04 15 views
5

Mam problemy z ładowaniem zabezpieczonych stron internetowych za pomocą protokołu SSL przy użyciu Androids WebView. Zawsze dostaję błędy takie jak: onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>Certyfikaty WebView i SSL

Zainstalowałem już wszystkie certyfikaty łańcucha certyfikatów tego serwera w pęku kluczy Androida za pomocą Ustawienia-> Bezpieczeństwo-> Zainstaluj z karty SD. Mogę nawet zobaczyć, że jeden z zainstalowanych certyfikatów idealnie pasuje do wyjścia błędu z LogCat. Robi się jeszcze dziwniej, jeśli używam domyślnej aplikacji Browser: ładuje stronę bez żadnych problemów, nawet jeśli odinstaluję wszystkie wymienione wcześniej certyfikaty. Naprawdę nie mam pojęcia, w jaki sposób mogę to naprawić bez zaufania do wszystkich certyfikatów, wywołując handler.proceed() w onReceivedSslError(), co jest potencjalnym problemem bezpieczeństwa. Każda pomoc jest doceniana. Dzięki!

Cheers Bjoern

EDIT: Certyfikat główny jest autopodpisywany ponieważ jest przeznaczone wyłącznie do wykorzystania w serwerach intranetowych. Pomyślałem, że wszystkie certyfikaty, które dodam do zaufanych poświadczeń Androida, będą zaufane.

+0

Jeśli chcesz nam pomóc, powinieneś podać prawdziwe informacje, zamiast korzystać z czyjejś strony, takiej jak 'xyz.com' (to jest prawdziwa strona). – jww

+0

Przepraszam, że użyłem prawidłowego hosta. Niestety nie mogę ujawnić informacji o kliencie i mam nadzieję, że to zrozumiesz. – bjoernb

Odpowiedz

2

Przy korzystaniu z usług z samopodpisanymi certyfikatami należy używać onReceiveSslError() i handler.proceed(), a widok internetowy nie jest z nimi zgodny.

Myślę, że chciałbym teraz wyglądać po stronie serwera ssl realizacji. Jeśli masz wiele usług z tym samym sprawdzaniem certyfikatu dla obsługi SNI i jeśli jest dobrze skonfigurowany. Następnie sprawdź, czy usługa, z którą się łączysz, zwróci właściwy certyfikat. Sprawdź również Alternatywną Nazwę podmiotu na swoim serwerze i skonfiguruj ją zgodnie ze swoimi potrzebami.

Do tego zadania można użyć tych poleceń.

openssl s_client -showcerts -connect yourhost.com:443 

openssl s_client -connect yourhost.com:443 

openssl s_client -servername yourhost.com -connect yourhost.com:443 

openssl s_client -connect yourhost.com:443 | openssl x509 -text 

Tu masz trochę więcej informacji z dokumentacji Android

Typowe problemy z nazwą hosta Weryfikacja Jak wspomniano na początku tego artykułu, istnieją dwa kluczowe elementy do weryfikacji SSL połączenia. Pierwszą z nich jest weryfikacja, czy certyfikat pochodzi z zaufanego źródła , na którym skupiono się w poprzedniej sekcji. Celem tej sekcji jest druga część: upewniając się, że serwer, z którym rozmawiasz, ma , przedstawia odpowiedni certyfikat. Gdy tak nie jest, można zazwyczaj zobaczyć błąd tak:

java.io.IOException: Nazwa hosta „example.com” nie została zweryfikowana na libcore.net.http.HttpConnection.verifySecureSocketHostname (httpconnection. Java: 223) na libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect (HttpsURLConnectionImpl.java:446) w libcore.net.http.HttpEngine.sendSocketRequest (HttpEngine.java:290) w libcore.net.http. HttpEngine.sendRequest (HttpEngine.java:240) w libcore.net.http.HttpURLConnectionImpl.getResponse (HttpURLConnectionImpl.java:282) w libcore.net.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:177) at libcore.net.http.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:271) Jednym z powodów takiej sytuacji jest błąd konfiguracji serwera.Serwer jest skonfigurowany z certyfikatem, który nie ma podmiotu lub temat alternatywnych pól nazwy odpowiadających serwerowi, do którego próbujesz dotrzeć. Możliwe jest użycie jednego certyfikatu z wieloma różnymi serwerami. Na przykład, patrząc na certyfikat google.com z openssl s_client -connect google.com:443 | openssl x509 -tutaj możesz zobaczyć, że temat obsługujący * .google.com, ale , również podlega alternatywnym nazwom * .youtube.com, * .android.com i innym. Błąd występuje tylko wtedy, gdy nazwa serwera, z którym łączysz się, nie jest wymieniona przez certyfikat jako akceptowalna.

Niestety może się to zdarzyć z innego powodu: wirtualnego hostingu . Podczas współużytkowania serwera dla więcej niż jednej nazwy hosta za pomocą protokołu HTTP, , serwer WWW może stwierdzić na podstawie żądania HTTP/1.1, która docelowa nazwa docelowa to . Niestety jest to skomplikowane z powodu HTTPS, ponieważ serwer musi wiedzieć, który certyfikat zwróci zanim zobaczy żądanie HTTP. Aby rozwiązać ten problem, nowsze wersje SSL, w szczególności TLSv.1.0 i nowsze, obsługują nazwę serwera Wskazanie (SNI), która umożliwia klientowi SSL określenie docelowej nazwy hosta na serwerze, aby można było zwrócić właściwy certyfikat.

Na szczęście funkcja HttpsURLConnection obsługuje interfejs SNI od wersji Androida 2.3. Niestety, klient HTTP Apache nie, który jest jednym z wielu powodów, dla których zniechęcamy go do używania. Jednym z obejść, jeśli musisz obsługiwać klienta Android 2.2 (i starszy) lub klienta HTTP Apache, jest skonfigurowanie alternatywnego hosta wirtualnego na unikalnym porcie, aby jednoznacznie uzyskać certyfikat serwera, który ma zostać zwrócony.

Mam nadzieję, że to pomaga.

Powiązane problemy