Java Keytool-Fehler nach dem Importieren des Zertifikats, "Keytool-Fehler: java.io.FileNotFoundException & Access Denied"

128

Ich versuche, eine Java-Web-API über HTTPS zu verbinden. Es wird jedoch eine Ausnahme ausgelöst:

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

Ich habe die folgenden Schritte ausgeführt, die ich aus Online-Tutorials zu Keytools und SSL-Zertifikaten gelernt habe:

  1. Ich habe die HTTPS-URL in den Browser kopiert, die SSL-Zertifikate heruntergeladen und sie mit Internet Explorer im Browser installiert.

  2. Exportierte die Zertifikate in einen Pfad auf meinem Computer, die Zertifikate wurden als gespeichert .cer

  3. Verwendete die Importoption des Keytools. Der folgende Befehl wurde fehlerfrei ausgeführt.

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
  4. Ich wurde an der Eingabeaufforderung zur Eingabe eines Kennworts aufgefordert, das ich eingegeben und dann authentifiziert habe.

  5. Das cmdFenster druckte einige Zertifikatdaten und Signaturen und ich wurde mit der Frage aufgefordert:

    Vertrauen Sie diesem Zertifikat?

    Ich antwortete ja.

  6. Die cmd-Eingabeaufforderung wird angezeigt

    Zertifikat wurde zum Keystore hinzugefügt

    Nach dieser Meldung wurde jedoch eine weitere Ausnahme angezeigt:

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

Als ich schließlich den Keystore überprüfte, wurde das SSL-Zertifikat nicht hinzugefügt, und meine Anwendung gibt dieselbe Ausnahme aus, die ich früher beim Versuch, eine Verbindung herzustellen, erhalten habe:

(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)
cyber101
quelle
Könnten Sie den genauen keytoolBefehl, den Sie ausgeführt haben, und seine Ausgabe veröffentlichen? Einige der offensichtlichen Probleme hier sind der Tippfehler -keystoreund die Tatsache, dass Keytool den Schlüsselspeicher zum Importieren des Schlüssels nicht finden konnte
Alex
Ich wollte schreiben: keytool -import -alias downloadedCertAlias ​​-keystore C: \ path \ to \ my \ keystore \ cacerts.file -file C: \ path \ von \ exportedCert.cer Ich erwähnte auch den Befehl, der fehlerfrei ausgeführt wurde, also offensichtlich Das ist nur ein Rechtschreibfehler in meiner Frage !!! Trotzdem danke
cyber101

Antworten:

266

Dies kann passieren, wenn Sie die Eingabeaufforderung nicht im Administratormodus ausführen. Wenn Sie Windows 7 verwenden, können Sie loslegen, cmd eingeben und Strg + Umschalt + Eingabetaste drücken. Dadurch wird die Eingabeaufforderung im Administratormodus geöffnet. Wenn nicht, können Sie auch starten -> alle Programme -> Zubehör -> mit der rechten Maustaste auf die Eingabeaufforderung klicken und auf "Als Administrator ausführen" klicken.

Sharan Rajendran
quelle
9
Für Mac-Benutzer wird dieses Problem mit einem einfachen Sudo behoben.
Wahrhaftigkeit
13
Als Administrator zu arbeiten ist nicht die richtige Lösung. Die meisten Unternehmen sperren den Administratorzugriff. Es ist besser, den Grund dafür zu bestimmen, warum der Zugang verweigert wird, als die Vorherrschaft zu erhöhen.
Skword
Geben
Vielen Dank. Control-Shift-CMD war die einzige Möglichkeit, den Cacerts-Speicher zu ändern.
Malcolm Boekhoff
@Afshar, vielen Dank, ich habe schon ziemlich lange damit zu kämpfen.
Rajan Chauhan
21

Ich hatte das gleiche Problem unter Windows und konnte es lösen, indem ich cmd.exe als Administrator ausführte (Rechtsklick im Startmenü, dann "Als Administrator ausführen").

Daniel
quelle
19

Ich hatte das gleiche Problem beim Importieren des Zertifikats in den lokalen Keystore. Immer wenn ich den Befehl keytool gebe, erhalte ich den folgenden Fehler.

Zertifikat wurde zum Keystore-Keytool-Fehler hinzugefügt: java.io.FileNotFoundException: C: \ Programme \ Java \ jdk1.8.0_151 \ jre \ lib \ security (Zugriff verweigert)

Folgende Lösungsarbeit für mich.

1) Stellen Sie sicher, dass Sie die Eingabeaufforderung in Rus als Administratormodus ausführen

2) Ändern Sie Ihr aktuelles Verzeichnis in% JAVA_HOME% \ jre \ lib \ security

3) Geben Sie dann den folgenden Befehl aus

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

3) Geben Sie das Passwort ein

4) Geben Sie y ein

5) Bei erfolgreichem "Zertifikat wurde zum Keystore hinzugefügt" wird die folgende Meldung angezeigt.

Stellen Sie sicher, dass Sie die " cacerts " nur im Parameterwert -keystore angeben, da ich den vollständigen Pfad wie "C **: \ Programme \ Java \ jdk1.8.0_151 \ jre \ lib \ security **" angegeben habe.

Hoffe das wird funktionieren

Waqas Ahmed
quelle
1
Wie hier erwähnt, hat es für mich funktioniert , tatsächlich im Sicherheitsverzeichnis zu sein und nur den "cacerts" -Namen des Zertifikats anstelle des vollständigen Pfads anzugeben.
RisingTide
Ich habe sudo -i verwendet, um mich im ersten Schritt auf dem Mac zum Superuser zu machen, und bin den Schritten gefolgt, und es hat funktioniert. Ich habe die Carets-Datei als Textdatei geöffnet und mein Zertifikat gefunden, indem ich den Befehl f ausgeführt habe, um nach seinem Namen (oder etwas anderem im Zusammenhang mit dem Zertifikat) zu suchen.
Chigozie A.
11

Überprüfen Sie die Schreibberechtigungen im Keystore.

Partha Saradhi
quelle
2
Wenn jemand dies erweitern kann, ändert sich nichts, wenn er nur die Berechtigungen überprüft.
user3071284
Wenn Sie
Wie prüfe ich die Weite-Erlaubnis?
Ahmad Arslan
3

Stellen Sie für Mac-Benutzer sicher, dass Sie sudo verwenden, und geben Sie bei Aufforderung zuerst Ihr Administratorkennwort an. Darauf folgt das Schlüsselspeicherkennwort, das normalerweise "changeit" lauten sollte, es sei denn, Sie haben es tatsächlich geändert.

VK
quelle
1

Wenn Sie Windows 8 verwenden:

  1. Klicken Sie auf die Schaltfläche Start
  2. Geben Sie in das Suchfeld ein command prompt
  3. Klicken Sie im Ergebnis mit der rechten Maustaste command promptund klicken Sie Run as administrator. Führen Sie dann den Befehl keytool aus.
Arungopal
quelle
1

Sie können sich die Berechtigung geben, dieses Problem zu beheben.

Klicken Sie mit der rechten Maustaste auf cacerts> wählen Sie Eigenschaften> wählen Sie die Registerkarte Securit> Alle Berechtigungen für alle Gruppen- und Benutzernamen zulassen.

Das hat bei mir funktioniert.

goyalshub1509
quelle
0

Ich habe sogar die Eingabeaufforderung als Administrator ausgeführt, aber mit dem folgenden Fehler hat es bei mir nicht funktioniert.

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

Wenn sich der Pfad zum Keytool nicht in Ihren Systempfaden befindet, müssen Sie den vollständigen Pfad verwenden, um das Keytool zu verwenden

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

Der Befehl sollte also so sein

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

das hat bei mir funktioniert.

sher17
quelle
0

Ich habe diesen Fehler auch erhalten, obwohl ich cmd als Administrator ausgeführt habe.

Die Hauptursache ist: Die Datei stammt aus VCS (Subversion, Perforce usw.), und als ich die Eigenschaften dieser Datei überprüft habe, sind ihre Attribute schreibgeschützt .

Die Lösung lautet also:

  • (1) Deaktivieren Sie das Attribut "Schreibgeschützt".
  • (2) Auschecken aus VCS, lassen Sie die Datei unter dem Status Lesen & Schreiben.
Schröder
quelle
-1

Gelöst

  1. Führen Sie CMD einfach als Administrator aus.
  2. Stellen Sie sicher, dass Sie das richtige Truststore-Passwort verwenden
Ismael Ozil
quelle
-2

Sie können eine andere Festplatte oder einen anderen Pfad (nicht C) speichern. 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

Geben Sie hier die Bildbeschreibung ein

maithanhduyan
quelle