2012-07-23 12 views
97

Desidero importare un certificato autofirmato in Java, quindi qualsiasi applicazione Java che proverà a stabilire una connessione SSL si fiderà di questo certificato.Come importare correttamente un certificato autofirmato nel keystore Java disponibile per tutte le applicazioni Java per impostazione predefinita?

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 

Eppure, quando provo a fare funzionare HTTPSClient.class ho ancora:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
+0

Non mi baserei necessariamente su quel codice. Cose come 'Security.addProvider (nuovo com.sun.net.ssl.internal.ssl.Provider())' sono completamente inutili nella prima parte. Il secondo non esegue alcuna verifica del certificato. Prova con un semplice 'URLConnection' per iniziare. Sei sicuro di aver modificato 'cacerts' in' lib/security' della tua installazione JRE? Hai provato l'opzione di debug ['trustmanager'] (http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Debug)? – Bruno

risposta

148

In Windows il modo più semplice è quello di utilizzare il programma portecle.

  1. Scaricare e installare portecle.
  2. Primo tentativo al 100% di sapere quale JRE o JDK viene utilizzato per eseguire il programma. Su un Windows 7 a 64 bit potrebbero esserci parecchi JRE. Process Explorer può aiutarti con questo o è possibile utilizzare: System.out.println(System.getProperty("java.home"));
  3. Copia il file JAVA_HOME \ lib \ security \ cacerts in un'altra cartella.
  4. In Portecle clic su File> Apri file archivio chiavi
  5. Selezionare il file cacerts
  6. inserire questa password: changeit
  7. Fare clic su Strumenti> Importa Trusted certificato
  8. Cercare il file mycertificate.pem
  9. Fare clic su Importa
  10. Fare clic su OK per l'avviso sul percorso di fiducia.
  11. Fare clic su OK quando vengono visualizzati i dettagli sul certificato.
  12. Fare clic su Sì per accettare il certificato come affidabile.
  13. Quando richiede un alias, fare clic su OK e fare nuovamente clic su OK quando viene indicato di aver importato il certificato.
  14. Fare clic su Salva. Non dimenticarlo o il cambiamento è scartato.
  15. Copia il cacerts del file dove l'hai trovato.

Su Linux:

È possibile scaricare il certificato SSL da un server web che 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 cacerts Java:

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

Edit:

In questi giorni non abbiamo spesso devono aggiungere un certificato al chiavi perché è possibile ottenere un certificato per $ 5 per l'anno da ssls.com. Nel caso sia un'opzione per te.

+1

L'idea principale di questo non è il portecolo ma l'importazione di certificati nel keystore giusto. – Alfabravo

+0

+1 Grazie amico! Anche se è un post piuttosto vecchio, ha risolto i miei problemi !!! Portacle non era LA soluzione ma mi ha aiutato molto a semplificare le cose! (forse solo a causa delle conversioni dei certificati) – Andre

+7

Complimenti per aver inserito i comandi di openssl nella risposta insieme alla risposta di Windows :) –

26

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

è possibile ottenere la versione più recente 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 

`` `

+0

Sei un LIFESTAVER! Ho intenzione di raccogliere supporto per questa risposta. È orribilmente sottovalutato. –

+0

fantastico! grazie mille per il tuo script –

+0

così utile. grazie. – codemonkey

18
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" 
+0

semplice ed efficace !! –

3

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

  1. Aprire Esplora risorse e passare al file cacerts, che si trova nella sottocartella jre \ lib \ security in cui è installato AX Nucleo client. Il percorso predefinito è C: \ Programmi \ ACL Software \ AX Client principale \ jre \ lib \ security
  2. Creare una copia di backup del file prima di apportare qualsiasi modifica.
  3. In base ai certificati ricevuti dall'autorità di certificazione che si sta utilizzando, potrebbe essere necessario importare un certificato intermedio e/o certificato radice nel file cacerts. Utilizzare la seguente sintassi 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. Immettere la password per il keystore al prompt "Password" e premere Invio. La password Java predefinita per il file cacerts è "changeit". Digitare "y" nel prompt "Trust this certificate?" E premere Invio.
+0

Utilizzare questo comando: -> keytool -import -alias -keystore -trustcacerts -file user1688640

0

potrebbe desiderare di provare

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

Onestamente non ho idea di dove si mette il certificato se basta scrivere cacerts Basta fare un percorso completo

2

Questo ha funzionato per me. :)

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

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

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

  1. assicurarsi di identificare la JRE all'interno del JDK che si sarà utilizzando
  2. Avviare il prompt/cygwin come amministratore
  3. passare all'interno della directory bin di quel JDK es. cd/cygdrive/c/Program \ Files/Java/jdk1.8.0_121/jre/bin
  4. Eseguire il comando keytool dal suo interno, dove si fornisce il percorso della nuova 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" 
    

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

Problemi correlati