Próbuję połączyć się z urządzeniem IIS6 z uruchomionym certyfikatem 256-bitowym certyfikatem chrzestnym SSL i pojawia się błąd:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Próbowałem ustalić, co może być przyczyną, ale teraz rysuję puste.
Oto jak się łączę:
HttpsURLConnection conn;
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream());
źródło
W przeciwieństwie do przyjętej odpowiedzi, nie potrzebujesz niestandardowego menedżera zaufania, musisz naprawić konfigurację serwera!
Uderzyłem ten sam problem podczas łączenia się z serwerem Apache z niepoprawnie zainstalowanym certyfikatem dynadot / alphassl. Łączę się za pomocą HttpsUrlConnection (Java / Android), który rzucał -
Rzeczywistym problemem jest błędna konfiguracja serwera - przetestuj go http://www.digicert.com/help/ lub podobnej, a nawet podpowie Ci rozwiązanie:
„Certyfikat nie jest podpisany przez zaufany organ (porównanie z głównym sklepem Mozilli). Jeśli kupiłeś certyfikat od zaufanego organu, prawdopodobnie po prostu musisz zainstalować jeden lub więcej certyfikatów pośrednich . Skontaktuj się z dostawcą certyfikatu, aby uzyskać pomoc platforma serwera ”.
Możesz także sprawdzić certyfikat za pomocą openssl:
openssl s_client -debug -connect www.thedomaintocheck.com:443
Prawdopodobnie zobaczysz:
Verify return code: 21 (unable to verify the first certificate)
i wcześniej w danych wyjściowych:
Łańcuch certyfikatów będzie zawierał tylko 1 element (twój certyfikat):
... ale powinien odwoływać się do organów podpisujących w łańcuchu z powrotem do zaufanego systemu Android (Verisign, GlobalSign itp.):
Instrukcje (i certyfikaty pośrednie) dotyczące konfigurowania serwera są zwykle dostarczane przez organ, który wystawił certyfikat, na przykład: http://www.alphassl.com/support/install-root-certificate.html
Po zainstalowaniu certyfikatów pośrednich dostarczonych przez mojego wystawcę certyfikatu nie mam teraz błędów podczas łączenia za pomocą HttpsUrlConnection.
źródło
Możesz zaufać konkretnemu certyfikatowi w czasie wykonywania.
Wystarczy pobrać go z serwera, włożyć zasoby i załadować w ten sposób przy użyciu ssl-utils-android :
W powyższym przykładzie użyłem
OkHttpClient
aleSSLContext
można go używać z dowolnym klientem w Javie.Jeśli masz jakieś pytania, możesz je zadać. Jestem autorem tej małej biblioteki.
źródło
Aktualizacja na podstawie najnowszej dokumentacji Androida (marzec 2017 r.):
Gdy pojawi się ten typ błędu:
problem może być jednym z następujących:
Rozwiązaniem jest nauczenie
HttpsURLConnection
zaufania do określonego zestawu urzędów certyfikacji. W jaki sposób? Sprawdź https://developer.android.com/training/articles/security-ssl.html#CommonProblemsInni, którzy korzystają
AsyncHTTPClient
zcom.loopj.android:android-async-http
biblioteki, sprawdź Setup AsyncHttpClient, aby korzystać z HTTPS .źródło
Jeśli używasz modernizacji, musisz dostosować swojego OkHttpClient.
źródło
getUnsafeOkHttpClient()
w Kotlin: stackoverflow.com/a/60507560/2914140 .Odpowiadanie na bardzo stary post. Ale może pomoże to nowicjuszowi, a jeśli nie spełni powyższego warunku.
Wyjaśnienie: Wiem, że nikt nie chce bzdur wyjaśnienia; raczej rozwiązanie. Ale w jednym pakiecie próbujesz uzyskać dostęp do usługi z komputera lokalnego na maszynie zdalnej, która nie ufa twojemu komputerowi. Żądanie wymaga zaufania od zdalnego serwera.
Rozwiązanie: następujące rozwiązanie zakłada, że spełnione są następujące warunki
Kroki:
Potrzebujesz pliku rozszerzenia .keystore, aby zarejestrować swoją aplikację. Jeśli nie wiesz, jak utworzyć plik .keystore; następnie postępuj zgodnie z następującą sekcją Utwórz plik .keystore lub w inny sposób przejdź do następnej sekcji Podpisz plik APK
Utwórz plik .keystore
Otwórz Android Studio. Kliknij menu główne Kompilacja> Wygeneruj podpisany plik APK. W następnym oknie kliknij przycisk Utwórz nowe ... przycisk. W nowym oknie wprowadź dane we wszystkich polach. Zapamiętaj dwa pola Hasło, które polecam, powinno mieć to samo hasło; nie używaj innego hasła; a także zapamiętać ścieżkę zapisu w skrajnym górnym polu magazynu kluczy ścieżce: . Po wprowadzeniu wszystkich pól kliknij przycisk OK.
Podpisz plik APK
Teraz musisz zbudować podpisaną aplikację z właśnie utworzonego pliku .keystore. Wykonaj następujące kroki
Choose existing...
przyciskKey store password
iKey password
pól. Wprowadź także aliasbuild.gradle
plikach, musisz wybraćBuild Types
iFlavors
.Build Types
wyborurelease
z menu rozwijanegoNa
Flavors
to jednak będzie, zależy od ustawień wbuild.gradle
pliku. Wybierzstaging
z tego pola. Użyłem następujących ustawień wbuild.gradle
, możesz użyć tego samego co moje, ale upewnij się, że zmieniłeśapplicationId
nazwę pakietuKliknij dwa dolne
Signature Versions
pola wyboru i kliknijFinish
przycisk.Prawie na miejscu:
Cała ciężka praca została wykonana, teraz ruch prawdy. Aby uzyskać dostęp do serwera pomostowego z kopią zapasową utworzoną przez serwer proxy, musisz wprowadzić pewne ustawienia w rzeczywistych testujących urządzeniach z Androidem.
Ustawienie proxy w urządzeniu z Androidem:
Modify network
Advanced options
jeśli nie widziszProxy Hostname
polaProxy Hostname
wprowadź adres IP lub nazwę hosta chcesz się połączyć. Typowy serwer pomostowy zostanie nazwany jakostg.api.mygoodcompany.com
9502
Save
przyciskOstatni przystanek:
Pamiętaj, że wygenerowaliśmy podpisany plik apk w sekcji Zarejestruj plik APK . Nadszedł czas, aby zainstalować ten plik APK.
adb install
name of the apk file
adb command not found
. Wpisz pełną ścieżkę jakoC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe
install
name of the apk file
Mam nadzieję, że problem może zostać rozwiązany. Jeśli nie, proszę zostawić komentarz.
Salam!
źródło
Komunikat o błędzie, który otrzymywałem, był podobny, ale przyczyną był fakt, że certyfikat z podpisem własnym wygasł. Gdy podjęto próbę klienta openssl, podał mi powód, który został przeoczony, kiedy sprawdzałem okno dialogowe certyfikatu z firefox.
Ogólnie rzecz biorąc, jeśli certyfikat znajduje się w magazynie kluczy i jego „WAŻNY”, ten błąd zgaśnie.
źródło
TrustManager
i innego zestawu kryteriów. Ale od razu po tym musisz pracować.Miałem ten sam problem podczas łączenia się z klienta Android na serwerze Kurento. Serwer Kurento używa certyfikatów jks, więc musiałem przekonwertować na niego PEM. Jako dane wejściowe do konwersji użyłem pliku cert.pem i prowadzi to do takich błędów. Ale jeśli użyjesz fullchain.pem zamiast cert.pem - wszystko jest w porządku.
źródło
Skorzystaj z https://www.ssllabs.com/ssltest/ aby przetestować domenę.
Rozwiązanie Shihab Uddin w Kotlin.
źródło
Miałem ten sam problem, co znalazłem, to że podany plik certyfikatu .crt brakuje certyfikatu pośredniego. Poprosiłem więc wszystkie pliki .crt od mojego administratora serwera, a następnie skonfliktowałem je w odwrotnej kolejności.
Dawny. 1. Root.crt 2. Inter.crt 3. myCrt.crt
w systemie Windows wykonałem kopię Inter.crt + Root.crt newCertificate.crt
(Tutaj zignorowałem myCrt.crt)
Następnie podałem plik newCertificate.crt do kodu poprzez inputstream. Robota wykonana.
źródło
Błąd zakotwiczenia zaufania może wystąpić z wielu powodów. Dla mnie po prostu próbowałem uzyskać dostęp
https://example.com/
zamiasthttps://www.example.com/
.Możesz więc sprawdzić dwa razy swoje adresy URL, zanim zaczniesz budować własnego Trust Managera (tak jak ja).
źródło
W telefonach z piernikiem zawsze pojawia się ten błąd:
Trust Anchor not found for Android SSL Connection
nawet jeśli skonfiguruję poleganie na moim certyfikacie.Oto kod, którego używam (w języku Scala):
a oto kod połączenia:
Zasadniczo konfiguruję zaufanie do mojego certyfikatu niestandardowego. Jeśli to się nie powiedzie, wyłączam zabezpieczenia. To nie jest najlepsza opcja, ale jedyny wybór, jaki znam ze starymi i wadliwymi telefonami.
Ten przykładowy kod można łatwo przetłumaczyć na Javę.
źródło
W moim przypadku działo się tak po aktualizacji do Androida 8.0. Samopodpisany certyfikat systemu Android, któremu ufano, korzystał z algorytmu podpisu SHA1wRSRS. Przejście na nowy certyfikat za pomocą algorytmu podpisu SHA256wRSRS rozwiązało problem.
źródło
Wiem, że nie musisz ufać wszystkim certyfikatom, ale w moim przypadku miałem problemy z niektórymi środowiskami debugowania, w których mieliśmy certyfikaty z podpisem własnym i potrzebowałem brudnego rozwiązania.
Wszystko, co musiałem zrobić, to zmienić inicjalizację pliku
sslContext
gdzie
trustAllCerts
został stworzony w ten sposób:Mam nadzieję, że to się przyda.
źródło
Hostname '192.168.0.16' was not verified
. Testuję moje webapi lokalnie za pomocą mojego debuggera (IIS Express). Jakiś pomysł jak to naprawić? Dzięki :)Miałem podobny problem i całkowicie wykluczyłem strategię zaufania do wszystkich źródeł.
Tutaj udostępniam moje rozwiązanie zastosowane do aplikacji zaimplementowanej w Kotlinie
Najpierw poleciłbym skorzystanie z następującej strony internetowej w celu uzyskania informacji o certyfikacie i jego ważności
Jeśli nie pojawia się jako „Zaakceptowani wystawcy” w domyślnym magazynie zaufania Androida , musimy uzyskać ten certyfikat i włączyć go do aplikacji, aby utworzyć niestandardowy magazyn zaufania
Idealnym rozwiązaniem w moim przypadku było stworzenie wysokiego poziomu Trust Managera, który łączy niestandardowy i domyślny magazyn zaufania Androida
Tutaj ujawnia kod wysokiego poziomu użyty do skonfigurowania klienta OkHttpClient, którego używał przy modernizacji.
W ten sposób mogłem komunikować się z serwerem z certyfikatem z podpisem własnym iz innymi serwerami z certyfikatem wydanym przez zaufany podmiot certyfikujący
To jest to, mam nadzieję, że może komuś pomóc.
źródło
Wiem, że to bardzo stary artykuł, ale natknąłem się na ten artykuł, próbując rozwiązać problemy z zakotwiczeniem zaufania. Opublikowałem, jak to naprawiłem. Jeśli masz wstępnie zainstalowany główny urząd certyfikacji, musisz dodać konfigurację do manifestu.
https://stackoverflow.com/a/60102517/114265
źródło
źródło
Też napotkałem ten sam problem. Po prostu usuwam hhtps na http, takie jak
final public static String ROOT_URL = "https://example.com";
dofinal public static String ROOT_URL = "http://example.com";
W końcu rozwiązałem ten problem.
źródło