Błąd narzędzia Java Keytool po zaimportowaniu certyfikatu, „błąd keytool: java.io.FileNotFoundException & Access Denied”

128

Próbuję połączyć Java Web API przez HTTPS; jednak wyjątek jest zgłaszany:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException

Wykonałem następujące kroki, których nauczyłem się z samouczków online keytool i certyfikatów SSL:

  1. Skopiowałem adres URL HTTPS do przeglądarki, pobrałem certyfikaty SSL i zainstalowałem je w przeglądarce za pomocą Internet Explorera.

  2. Wyeksportowałem certyfikaty do ścieżki na moim komputerze, certyfikaty zostały zapisane jako .cer

  3. Użyto opcji importu narzędzia keytool. Poniższe polecenie zostało wykonane bez żadnych błędów.

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
  4. Zostałem poproszony o hasło w wierszu polecenia, które wprowadziłem, a następnie zostałem uwierzytelniony.

  5. W cmdoknie wydrukowano dane certyfikatu i podpisy, a ja zostałem poproszony o pytanie:

    Zaufać temu certyfikatowi?

    Odpowiedziałem tak.

  6. Zostanie wyświetlony monit cmd

    Certyfikat został dodany do magazynu kluczy

    Jednak po tym komunikacie został wyświetlony kolejny wyjątek:

    keytool error: java.io.FileNotFoundException: C:\Program files\...\cacerts <Access Denied>

Wreszcie, kiedy sprawdziłem magazyn kluczy, certyfikat SSL nie został dodany, a moja aplikacja daje ten sam wyjątek, który otrzymałem wcześniej podczas próby połączenia:

(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)
cyber101
źródło
czy możesz opublikować dokładne keytoolpolecenie, które wykonałeś, i jest ono wyświetlane? niektóre z oczywistych problemów to literówka w -keystoreargumentacji oraz fakt, że narzędzie keytool nie mogło znaleźć magazynu kluczy do zaimportowania klucza
Alex
Chciałem napisać: keytool -import -alias downloadCertAlias ​​-keystore C: \ path \ to \ my \ keystore \ cacerts.file -file C: \ path \ of \ exportedCert.cer Wspomniałem też o poleceniu wykonanym bez błędów, więc oczywiście to tylko błąd w pisowni w moim pytaniu !!! W każdym razie dzięki
cyber101

Odpowiedzi:

267

Może się to zdarzyć, jeśli nie używasz wiersza polecenia w trybie administratora. Jeśli używasz systemu Windows 7, możesz przejść do uruchomienia, wpisać cmd i nacisnąć Ctrl + Shift + Enter. Spowoduje to otwarcie wiersza polecenia w trybie administratora. Jeśli nie, możesz również przejść do Start -> wszystkie programy -> akcesoria -> kliknij prawym przyciskiem myszy wiersz polecenia i kliknij „Uruchom jako administrator”.

Sharan Rajendran
źródło
9
W przypadku użytkowników komputerów Mac proste sudo rozwiąże ten problem.
trueful_ness
13
praca jako administrator nie jest właściwym rozwiązaniem. Większość firm blokuje dostęp administratora. Lepiej jest ustalić powód, dla którego odmawia się dostępu, niż podnosić uprawnienia.
skword
wpisz cmd i naciśnij Ctrl + Shift + enter i pomyślnie dodałem certyfikat - zadziałało dla mnie
deadend
Dzięki. Control-shift CMD był jedynym sposobem, w jaki mogłem zmienić magazyn cacerts.
Malcolm Boekhoff
@Afshar wielkie dzięki, walczę z tym od dłuższego czasu.
Rajan Chauhan
21

Miałem ten sam problem w systemie Windows i mogłem go rozwiązać, uruchamiając cmd.exe jako administrator (kliknij prawym przyciskiem myszy w menu Start, a następnie „Uruchom jako administrator).

daniel
źródło
19

Miałem ten sam problem podczas importowania certyfikatu do lokalnego magazynu kluczy. Za każdym razem, gdy wykonuję polecenie keytool, pojawia się następujący błąd.

Certyfikat został dodany do keystore keytool błąd: java.io.FileNotFoundException: C: \ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security (odmowa dostępu)

Poniższe rozwiązanie działa dla mnie.

1) upewnij się, że uruchamiasz wiersz polecenia w Rus jako tryb administratora

2) Zmień bieżący katalog na% JAVA_HOME% \ jre \ lib \ security

3), a następnie wydaj poniższe polecenie

keytool -import -alias "mycertificatedemo" -file "C: \ Users \ name \ Downloads \ abc.crt" -keystore cacerts

3) podaj hasło do zmiany

4) wpisz y

5) po pomyślnym dodaniu certyfikatu do magazynu kluczy zobaczysz następujący komunikat

Upewnij się, że podajesz " cacerts " tylko wartość parametru -keystore, ponieważ podałem pełną ścieżkę, np. "C **: \ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security **".

Mam nadzieję, że to zadziała

Waqas Ahmed
źródło
1
Jak wspomniano tutaj, znajdowanie się w katalogu bezpieczeństwa i podawanie tylko nazwy „cacerts” certyfikatu zamiast pełnej ścieżki było tym, co zadziałało.
wzrostPływ
Użyłem sudo -i, aby uczynić siebie superużytkownikiem w pierwszym kroku na Macu, wykonałem kroki i zadziałało. Otworzyłem plik Carets jako plik tekstowy i znalazłem mój certyfikat, wykonując polecenie f, aby wyszukać jego nazwę (lub cokolwiek innego związanego z certyfikatem).
Chigozie A.
11

Sprawdź uprawnienia do zapisu w magazynie kluczy.

partha saradhi
źródło
2
Jeśli ktoś może to rozwinąć, samo sprawdzenie uprawnień nic nie zmieni.
user3071284
ustawienie katalogu tomcat na tylko do odczytu spowoduje ten wyjątek
svarog
jak sprawdzić pozwolenie weite?
Ahmad Arslan,
3

W przypadku użytkowników komputerów Mac upewnij się, że wykonałeś sudo, a gdy zostaniesz o to poproszony, podaj najpierw hasło administratora, a po nim hasło magazynu kluczy, które zwykle powinno być „changeit”, chyba że faktycznie je zmieniłeś.

VK
źródło
1

Jeśli używasz Windows8:

  1. Kliknij przycisk Start
  2. W polu wyszukiwania wpisz command prompt
  3. W wyniku kliknij prawym przyciskiem myszy command prompti kliknij Run as administrator. Następnie wykonaj polecenie keytool.
arungopal
źródło
1

Możesz przyznać sobie uprawnienia do rozwiązania tego problemu.

Kliknij prawym przyciskiem myszy cacerts> wybierz właściwości> wybierz zakładkę Securit> Zezwól na wszystkie uprawnienia do wszystkich nazw grup i użytkowników.

To zadziałało dla mnie.

goyalshub1509
źródło
0

Uruchomiłem nawet wiersz polecenia jako Administrator, ale nie zadziałał on z poniższym błędem.

'keytool' is not recognized as an internal or external command,
 operable program or batch file.

Jeśli ścieżka do narzędzia keytool nie znajduje się w ścieżkach systemowych, będziesz musiał użyć pełnej ścieżki, aby użyć narzędzia keytool, którym jest

C:\Program Files\Java\jre<version>\bin

Tak więc polecenie powinno wyglądać następująco

"C:\Program Files\Java\jre<version>\bin\keytool.exe" -importcert -alias certificateFileAlias -file CertificateFileName.cer -keystore cacerts

to zadziałało dla mnie.

szer17
źródło
0

Otrzymałem również ten błąd, nawet gdy uruchomiłem cmd jako administrator.

Główna przyczyna: plik pochodzi z VCS (subversion, perforce itp.), A kiedy sprawdziłem właściwości tego pliku, jego atrybuty są tylko do odczytu .

Więc rozwiązaniem jest:

  • (1) wyłącz atrybut „Tylko do odczytu”;
  • (2) wyewidencjonuj z VCS, pozwól plikowi pod status odczytu i zapisu.
Schroeder
źródło
-1

ROZWIĄZANY

  1. Po prostu uruchom CMD jako administrator.
  2. Upewnij się, że używasz prawidłowego hasła magazynu zaufanych certyfikatów
Ismael ozil
źródło
-2

Możesz przechowywać inny dysk lub ścieżkę (nie C) EX: D \

C:\Program Files\Java\jre1.8.0_101\bin>keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore D:\myserver.jks -dname "CN=myserver,OU=IT-WebDev, O=TIACHOP, L=HCM, ST=0753, C=VN" && keytool -certreq -alias server -file D:\myserver.csr -keystore D:\myserver.jks

wprowadź opis obrazu tutaj

maithanhduyan
źródło