Come importare un certificato .cer in un keystore java?

Durante lo sviluppo di un client webservice Java mi sono imbattuto in un problema. L’autenticazione per il servizio web utilizza un certificato client, un nome utente e una password. Il certificato client che ho ricevuto dalla società dietro il webservice è in formato .cer . Quando controllo il file usando un editor di testo, ha il seguente contenuto:

 -----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 autenticare con il webservice.

Sono stato in grado di importare questo certificato in un keystore rimuovendo prima la prima e l’ultima riga, convertendo in unix newline ed eseguendo una base64-decode. Il file risultante può essere importato in un keystore (utilizzando il comando keytool ). Quando elenco le voci nel keystore, questa voce è del tipo trustedCertEntry . A causa di questo tipo di voce (?) Non posso usare questo certificato per autenticarsi con il webservice. Sto iniziando a pensare che il certificato fornito sia un certificato pubblico che viene utilizzato per l’autenticazione …

Una soluzione alternativa che ho trovato è di importare il certificato in IE ed esportarlo come file .pfx . Questo file può essere caricato come un 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 file .cer direttamente in Java. qualche idea?

Informazioni aggiuntive: la società dietro il webservice 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 seguito.

  • Se vuoi autenticare hai bisogno della chiave privata. Non c’è altra opzione.
  • Un certificato è una chiave pubblica con proprietà aggiuntive (come nome dell’azienda, paese, …) che è firmata da un’autorità di certificazione che garantisce che le proprietà allegate siano vere.
  • I file .CER sono certificati e non hanno la chiave privata. La chiave privata viene normalmente fornita con un file di archivio di chiavi .PFX. Se si autentica veramente è perché hai già importato la chiave privata.
  • Normalmente puoi importare certificati .CER senza problemi

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

L’importazione del .cer certificato .cer scaricato dal browser (apri l’url e dig i dettagli) nel keystore di java_home\jre\lib\security in java_home\jre\lib\security funzionato per me, al contrario dei tentativi di generare e utilizzare il mio keystore.

  1. Vai alla tua java_home\jre\lib\security
  2. ( Windows ) Apri la riga di comando dell’amministratore lì usando cmd e CTRL + MAIUSC + INVIO
  3. Esegui keytool per importare il certificato:
    • (Sostituisci il yourAliasName e il path\to\certificate.cer rispettivamente)
  ..\..\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 deve essere riconosciuto da JRE.

Ecco il codice che ho utilizzato per l’importazione programmata di 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); } 

Non dovresti dover apportare modifiche al certificato. Sei sicuro di avere il giusto comando di importazione?

Il seguente funziona per me:

 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----- 

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 di servizi Web possa autenticare il server.

Tuttavia, se è necessario eseguire l’autenticazione del 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 corrispondente chiave pubblica e il collegamento di tale chiave pubblica insieme ad alcune informazioni (email, nome, nome di dominio, ecc.) in un file chiamato richiesta di certificato. Quindi invii la richiesta di certificato alla società che ti ha già richiesto e creerai il tuo certificato, firmando la tua chiave pubblica con la chiave privata, e ti invieranno un file X509 con il tuo certificato, che puoi ora aggiungi il tuo keystore e sarai pronto per connetterti a un servizio web utilizzando SSL che richiede l’autenticazione del client.

Per generare la richiesta di certificato, utilizzare “keytool -certreq -alias -file -keypass -keystore”. Invia il file risultante alla società che sta per firmarlo.

Quando si ottiene il certificato, eseguire “keytool -importcert -alias -keypass -keystore”.

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

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

KeyStore Explorer

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

Le seguenti schermate aiuteranno (sono dal sito ufficiale)

Schermata predefinita che ottieni eseguendo il comando:

 [email protected]:~$./Downloads/kse-521/kse.sh 

inserisci la descrizione dell'immagine qui

Andare su Examine ed Examine a URL un’opzione Examine a URL 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 la descrizione dell'immagine qui

Questo è uno di Use case e rest è up-to the user (tutti i crediti vanno a keystore-explorer.org )

Ecco uno script che ho usato per importare in batch un gruppo di file crt nella directory corrente nel keystore java. Basta salvare questo 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 

Ecco come ha funzionato per me:

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

    —– INIZIO CERTIFICATO —– [dati serializzati da microsoft] —– CERTIFICATO DI FINE —–

  2. Apri browser Chrome (questo passaggio potrebbe funzionare anche con altri browser) impostazioni> mostra impostazioni avanzate> HTTPS / SSL> gestisci certificati Importa il .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