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)

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.


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


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").


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


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.


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.


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.

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.


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.


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.

-1

Gelöst

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

-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.