Come importare correttamente un certificato autofirmato nel keystore Java che è disponibile per impostazione predefinita in tutte le applicazioni Java?


144

Voglio importare un certificato autofirmato in Java, quindi qualsiasi applicazione Java che tenterà di stabilire una connessione SSL si fiderà di questo certificato.

Finora sono riuscito a importarlo in

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

Tuttavia, quando provo a correre HTTPSClient.classottengo ancora:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: creazione del percorso PKIX non riuscita: sun.security.provider.certpath.SunCertPathBuilderException: impossibile trovare un percorso di certificazione valido per la destinazione richiesta

Non farei necessariamente affidamento su quel codice. Cose come Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())sono completamente inutili nella prima parte. Il secondo non esegue alcuna verifica del certificato. Prova con una pianura URLConnectionper cominciare. Sei sicuro di aver modificato cacertsin lib/securitydella vostra installazione di JRE? Hai provato l' trustmanageropzione di debug ?
Bruno,

Risposte:


224

Su Windows il modo più semplice è utilizzare il portecle del programma .

  1. Scarica e installa portecle.
  2. Per prima cosa assicurati di sapere al 100% quale JRE o JDK viene utilizzato per eseguire il tuo programma. Su un Windows 7 a 64 bit potrebbero esserci alcuni JRE. Process Explorer può aiutarti in questo oppure puoi usare:System.out.println(System.getProperty("java.home"));
  3. Copia il file JAVA_HOME \ lib \ security \ cacerts in un'altra cartella.
  4. In Portecle fare clic su File> Apri file keystore
  5. Seleziona il file cacerts
  6. Immettere questa password: changeit
  7. Fai clic su Strumenti> Importa certificato attendibile
  8. Cerca il file mycertificate.pem
  9. Fai clic su Importa
  10. Fare clic su OK per l'avviso sul percorso di attendibilità.
  11. Fare clic su OK quando vengono visualizzati i dettagli sul certificato.
  12. Fare clic su Sì per accettare il certificato come attendibile.
  13. Quando richiede un alias, fai clic su OK e fai nuovamente clic su OK quando dice che ha importato il certificato.
  14. Fai clic su Salva. Non dimenticarlo o la modifica viene scartata.
  15. Copia il file cacerts nel punto in cui l'hai trovato.

Su Linux:

È possibile scaricare il certificato SSL da un server Web che lo sta già utilizzando in questo modo:

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

Opzionalmente verificare le informazioni sul certificato:

$ openssl x509 -in /tmp/examplecert.crt -text

Importare il certificato nel keystore Java cacerts:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt

1
L'idea principale da questo non è portecle ma l'importazione di certificati nel keystore giusto.
Alfabravo,

Questo ha funzionato, ma il mio java era in una posizione diversa. Il mio keystore si trovava in / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts che ho trovato eseguendo ps -ef | grep javache mi diceva che il mio java era in esecuzione da openjdk che si trova in / usr / lib / jvm / java-openjdk / bin / java. Inoltre, se questo se per una webapp ricordati di riavviare. Grazie per l'aiuto!!
Codezilla,

7
Non ho usato portecle, ma ho scoperto che Keystore Explorer funziona abbastanza bene per Windows, Linux (e dovrebbe funzionare anche su OSX)
Xantix

Molto utile davvero. 2 cose molto importanti evidenziate qui. Uno riguarda l'importazione nel keystore giusto. E un altro è assicurarsi di riavviare in caso di un server web.
sdm,

6
Nel 2019, possiamo anche ottenere certificati SSL gratuitamente utilizzando servizi come Lets encrypt
Ferrybig

41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"

12
Ti verrà richiesta la password del keystore, il valore predefinito è "changeit"
The Gilbert Arenas Dagger

33

Ho finito per scrivere un piccolo script che aggiunge i certificati ai keystore, quindi è molto più facile da usare.

Puoi ottenere l'ultima versione da https://github.com/ssbarnea/keytool-trust

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` `


"sudo keytool" NOPE
Dragas

17

Questo ha funzionato per me. :)

sudo keytool -importcert -file nomefile.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 

4

Se si utilizza un certificato firmato da un'autorità di certificazione che non è incluso nel file cacerts Java per impostazione predefinita, è necessario completare la seguente configurazione per le connessioni HTTPS. Per importare certificati in certificati:

  1. Apri Esplora risorse e vai al file cacerts, che si trova nella sottocartella jre \ lib \ security in cui è installato AX Core Client. Il percorso predefinito è C: \ Programmi \ Software ACL \ AX Core Client \ jre \ lib \ security
  2. Creare una copia di backup del file prima di apportare eventuali modifiche.
  3. A seconda dei certificati ricevuti dall'autorità di certificazione in uso, potrebbe essere necessario importare un certificato intermedio e / o certificato radice nel file cacerts. Utilizzare la sintassi seguente per importare i certificati: keytool -import -alias -keystore -trustcacerts -file
  4. Se si importano entrambi i certificati, l'alias specificato per ciascun certificato deve essere univoco.
  5. Digitare la password per il keystore al prompt "Password" e premere Invio. La password Java predefinita per il file cacerts è "changeit". Digita "y" in "Trust this certificate?" richiesta e premere Invio.

Utilizzare questo comando: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh

1

Il semplice comando 'keytool' funziona anche su Windows e / o con Cygwin.

SE stai usando Cygwin qui è il comando modificato che ho usato dal fondo della risposta di "S.Botha":

  1. assicurati di identificare il JRE all'interno del JDK che utilizzerai
  2. Avvia il tuo prompt / cygwin come amministratore
  3. andare all'interno della directory bin di quel JDK ad es. cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Esegui il comando keytool dall'interno, dove fornisci il percorso del tuo nuovo Cert alla fine, in questo modo:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Nota, perché se questo è sotto Cygwin stai dando un percorso a un programma non Cygwin, quindi il percorso è simile a DOS e tra virgolette.


0

Potrebbe voler provare

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

onestamente non ho idea di dove inserisca il tuo certificato se scrivi cacertssemplicemente dai un percorso completo


0

installa certificato in java linux

/ opt / jdk (versione) / bin / keytool -import -alias aliasname -file certificate.cer -keystore cacerts -storepass password


0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.