Come importare un certificato .cer in un keystore java?


226

Durante lo sviluppo di un client webservice Java ho riscontrato un problema. L'autenticazione per il servizio web utilizza un certificato client, un nome utente e una password. Il certificato client che ho ricevuto dall'azienda dietro il servizio web è in .cerformato. Quando controllo il file utilizzando un editor di testo, ha i seguenti contenuti:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Posso importare questo file come certificato in Internet Explorer (senza dover inserire una password!) E usarlo per autenticarmi con il servizio web.

Sono stato in grado di importare questo certificato in un keystore eliminando prima la prima e l'ultima riga, convertendomi in unix newline ed eseguendo una decodifica base64. Il file risultante può essere importato in un keystore (usando il keytoolcomando). Quando elenco le voci nel keystore, questa voce è del tipo trustedCertEntry. A causa di questo tipo di voce (?) Non posso usare questo certificato per autenticarmi con il servizio web. Sto iniziando a pensare che il certificato fornito sia un certificato pubblico utilizzato per l'autenticazione ...

Una soluzione alternativa che ho trovato è importare il certificato in IE ed esportarlo come .pfxfile. Questo file può essere caricato come keystore e può essere utilizzato per l'autenticazione con il webservice. Tuttavia, non posso aspettarmi che i miei clienti eseguano questi passaggi ogni volta che ricevono un nuovo certificato. Quindi vorrei caricare il .cerfile direttamente in Java. qualche idea?

Informazioni aggiuntive: la società dietro il servizio web mi ha detto che il certificato dovrebbe essere richiesto (utilizzando IE e il sito Web) dal PC e dall'utente che avrebbe importato il certificato in un secondo momento.

Risposte:


317
  • Se vuoi autenticarti hai bisogno della chiave privata - non c'è altra opzione.
  • Un certificato è una chiave pubblica con proprietà aggiuntive (come il nome dell'azienda, il paese, ...) che è firmata da un'autorità di certificazione che garantisce che le proprietà associate sono vere.
  • .CERi file sono certificati e non hanno la chiave privata. La chiave privata viene .PFX keystorenormalmente fornita con un file. Se ti autentichi davvero è perché hai già importato la chiave privata.
  • Normalmente è possibile importare .CERcertificati senza problemi con

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
Si scopre che la chiave privata viene generata da un plugin per IE. L'unica soluzione per ora è importare il certificato in IE ed esportare un file .pfx.
Jan-Pieter,

5
I file .CER hanno la chiave pubblica. Non hanno la chiave privata. Suggerisci la modifica ..
KyleM,

6
Cosa fa -alias qui?
hop

5
:( -> errore keytool: java.lang.Exception: input non un certificato X.509
negromante

1
@hop Un keystore java può avere più certificati ognuno con un diverso alias per identificarlo. Puoi usarlo come riferimento per identificarlo e / o recuperarlo a livello di codice con il nome alias.
Lujop,

85

L'importazione del .cerfile del certificato scaricato dal browser (apri l'URL e scava per i dettagli) nel keystore cacerts hajava_home\jre\lib\security funzionato per me, al contrario dei tentativi di generare e utilizzare il mio keystore.

  1. Vai al tuo java_home\jre\lib\security
  2. ( Windows ) Apri la riga di comando dell'amministratore usando cmde CTRL+ SHIFT+ENTER
  3. Esegui keytool per importare il certificato:
    • (Sostituisci yourAliasNamee path\to\certificate.cerrispettivamente)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

In questo modo non è necessario specificare ulteriori opzioni JVM e il certificato dovrebbe essere riconosciuto da JRE.


path \ to \ cert. Se il mio file è sul desktop come posso seguirlo? C: / user / desktop / o ../../../../desktop/filename
Jesse

su MacOS / Linux questo comando funziona con sudo. Grazie. ma cos'è noprompt param? Non l'ho usato e ci sono ancora riuscito.
Evgeniy Mishustin,

Si noti che quando si utilizza JDK per lo sviluppo, il percorso corretto è java_home\jdk_x.xx\jre\lib\security Per un percorso assoluto utilizzare la barra rovesciata, ad esempio le "C:\myCert.crt"virgolette sono facoltative se il percorso non contiene spazi bianchi.
jp-jee,

Grazie un milione di volte.
vikingsteve,

Domanda: che dire della chiave privata? La discussione riguarda i certificati client. La mia comprensione è che è necessario creare un CSR con una chiave privata, quindi ricevere un certificato client dalla società del sito Web remoto e quindi abbinare il certificato client alla chiave privata. La tua risposta non sembra menzionare nulla della chiave privata. Solo per chiedere.
user2367418

51

Ecco il codice che ho usato per importare a livello di codice file .cer in un nuovo KeyStore.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

Non dovresti apportare modifiche al certificato. Sei sicuro di eseguire il comando di importazione corretto?

Per me funziona quanto segue:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

dove mycert.cer contiene:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
Quando provo a importare il certificato non modificato nel keystore, viene visualizzato l'errore "errore keytool: java.lang.Exception: input non un certificato X.509". Dopo aver modificato il certificato nel modo descritto nel mio post, sono in grado di importare il certificato senza errori con un comando simile al tuo. Tuttavia, viene importato come trustedCertEntry e non viene utilizzato durante l'accesso al servizio web.
Jan-Pieter,

Potete per favore aggiungere il comando l'eccezione alla domanda? Sei sicuro di specificare un alias nel comando di importazione?
dogbane,

Non dimenticare di eseguire cmd come amministratore se stai utilizzando Windows
SilentBob470

9

Uno strumento di GUI open source è disponibile su keystore-explorer.org

KeyStore Explorer

KeyStore Explorer è una sostituzione della GUI open source per il keytool e il jarsigner delle utility da riga di comando Java. KeyStore Explorer presenta le loro funzionalità e altro ancora tramite un'interfaccia utente grafica intuitiva.

Le seguenti schermate aiuteranno (provengono dal sito ufficiale)

Schermata predefinita che si ottiene eseguendo il comando:

shantha@shantha:~$./Downloads/kse-521/kse.sh

inserisci qui la descrizione dell'immagine

Andare su Examinee Examine a URLopzione e quindi fornire l'URL Web che si desidera importare.

La finestra dei risultati sarà come sotto se fornisci il link al sito di Google. inserisci qui la descrizione dell'immagine

Questo è uno dei casi d'uso e il resto è a carico dell'utente (tutti i crediti vanno al keystore-explorer.org )


7

Il certificato che hai già è probabilmente il certificato del server o il certificato utilizzato per firmare il certificato del server. Ne avrai bisogno in modo che il tuo client del servizio web possa autenticare il server.

Ma se in aggiunta è necessario eseguire l'autenticazione client con SSL, è necessario ottenere il proprio certificato, per autenticare il client del servizio Web. Per questo è necessario creare una richiesta di certificato; il processo prevede la creazione della propria chiave privata e della chiave pubblica corrispondente e il collegamento di tale chiave pubblica insieme ad alcune delle informazioni (e-mail, nome, nome di dominio, ecc.) a un file chiamato richiesta di certificato. Quindi invii la richiesta di certificato alla società che ti ha già richiesto e creeranno il tuo certificato, firmando la tua chiave pubblica con la loro chiave privata, e ti rispediranno un file X509 con il tuo certificato, che puoi ora aggiungi al tuo keystore e sarai pronto per connetterti a un servizio web usando SSL che richiede l'autenticazione client.

Per generare la richiesta di certificato, utilizzare "keytool -certreq -alias -file -keypass -keystore". Invia il file risultante alla società che lo firmerà.

Quando ricevi il certificato, esegui "keytool -importcert -alias -keypass -keystore".

Potrebbe essere necessario utilizzare -storepass in entrambi i casi se il keystore è protetto (che è una buona idea).


5

Ecco uno script che ho usato per importare in batch un mucchio di file crt nella directory corrente nel keystore java. Basta salvarlo nella stessa cartella del certificato ed eseguirlo in questo modo:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

Ecco come ha funzionato per me:

  1. Salvare come .txt i dati del certificato nel seguente formato in un editor di testo

    ----- INIZIA CERTIFICATO ----- [dati serializzati da microsoft] ----- FINE CERTIFICATO -----

  2. Apri il browser Chrome (questo passaggio potrebbe funzionare anche con altri browser) impostazioni> mostra impostazioni avanzate> HTTPS / SSL> gestisci certificati Importa il file .txt nel passaggio 1
  3. Seleziona ed esporta quel certificato nel formato codificato Base-64. Salvalo come .cer
  4. Ora puoi usare keytool o Portecle per importarlo nel tuo keystore java
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.