Come importare un certificato in un cer chiavi Java?
-
29-09-2019 - |
Domanda
Durante lo sviluppo di un client webservice mi sono imbattuto in un problema Java. L'autenticazione per il webservice utilizza un certificato client, un nome utente e una password. Il certificato client che ho ricevuto da parte della società dietro il webservice è in formato .cer
. Quando ho ispezionare il file utilizzando un editor di testo, ha il seguente contenuto:
-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----
I può importare questo file come un certificato in Internet Explorer (senza dover inserire una password!) E utilizzarlo per l'autenticazione con il webservice.
Sono stato in grado di importare questo certificato in un keystore dal primo nudo la prima e l'ultima riga, a capo la conversione in UNIX e l'esecuzione di un base64 decodifica. Il file risultante può essere importato in un archivio di chiavi (utilizzando il comando keytool
). Quando ho lista le entrate nel keystore, ma questo articolo è di tipo trustedCertEntry
. A causa di questo tipo di voce (?) Non posso usare questo certificato per l'autenticazione con il webservice. Sto cominciando a pensare che il certificato fornito è un certificato pubblico che viene utilizzato per l'autenticazione ...
Una soluzione che ho trovato è per importare il certificato in IE ed esportarlo come file .pfx
. Questo file può essere caricato come chiavi e può essere utilizzato per l'autenticazione con il webservice. Tuttavia non posso aspettare i miei clienti a effettuare queste operazioni ogni volta che ricevono un nuovo certificato. Quindi vorrei caricare il file .cer
direttamente in Java. Ogni pensiero?
Informazioni aggiuntive: la società dietro il webservice mi ha detto che il certificato deve essere richiesto (utilizzando IE e il sito web) dal PC e l'utente che importare il certificato in seguito
.Soluzione
- Se si desidera autenticare è necessario la chiave privata -. Non c'è altra opzione
- Un certificato è una chiave pubblica con proprietà extra (come il nome dell'azienda, paese, ...) firmato da un'autorità di certificazione che garantisce che le proprietà associate sono vere.
- file
.CER
sono certificati e non hanno la chiave privata. La chiave privata viene fornito con un file.PFX keystore
normalmente. Se davvero l'autenticazione è perché già aveva importato la chiave privata. -
Normalmente è possibile importare certificati
.CER
senza problemi conkeytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias"
Altri suggerimenti
L'importazione di file del certificato .cer
scaricato dal browser (aprire l'URL e scavare per i dettagli) in cacerts chiavi in ??java_home\jre\lib\security
lavorato per me, al contrario di tentativi di generare e utilizzare il mio chiavi.
- Vai al tuo
java_home\jre\lib\security
- ( di Windows ) Allargare la riga di comando di amministrazione non utilizzando
cmd
e CTRL + SHIFT + INVIO - Esegui keytool per certificato d'importazione:
- (Sostituire rispettivamente
yourAliasName
epath\to\certificate.cer
)
- (Sostituire rispettivamente
..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer
In questo modo non c'è bisogno di specificare tutte le opzioni JVM aggiuntive e il certificato deve essere riconosciuto dal JRE.
Ecco il codice che ho usato per l'importazione di file con estensione cer programmaticamente in una nuova 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 si dovrebbe avere per apportare le modifiche al certificato. Sei sicuro si sta eseguendo il comando giusto importazione?
I seguenti opere 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-----
Uno strumento GUI open source è disponibile all'indirizzo keystore-explorer.org
KeyStore Explorer
KeyStore Explorer è una fonte sostitutiva aperta GUI per Java utilità della riga di comando keytool e jarsigner. KeyStore Explorer presenta loro funzionalità, e più, con una grafica intuitiva interfaccia utente.
A seguito schermi aiuterà (sono dal sito ufficiale)
schermata predefinita che si ottiene eseguendo il comando:
shantha@shantha:~$./Downloads/kse-521/kse.sh
E andare a Examine
e l'opzione Examine a URL
e poi dare l'URL web che si desidera importare.
La finestra dei risultati sarà come di seguito se si dà google collegamento di sito.
Questa è una delle Caso d'uso e di riposo è up-to l'utente (tutti i crediti vanno al keystore-explorer.org )
Il certificato che hai già è probabilmente il certificato del server, oppure il certificato utilizzato per firmare il certificato del server. Sarà necessario in modo che il vostro client di servizi web può autenticare il server.
Ma se in aggiunta è necessario eseguire l'autenticazione del client con SSL, allora avete bisogno di ottenere il proprio certificato, per l'autenticazione client di servizi web. Per questo è necessario creare una richiesta di certificato; il processo comporta la creazione la propria chiave privata, e la corrispondente chiave pubblica, e allegando che la chiave pubblica insieme ad alcune delle vostre informazioni (email, indirizzo, nome di dominio, ecc) in un file che si chiama la richiesta di certificato. Poi si invia la richiesta di certificato alla società che ha già chiesto, e creeranno il certificato, firmando la chiave pubblica con la propria chiave privata, e che ti invieremo il backup di un file X509 con il certificato, che è possibile ora aggiungere al vostro chiavi, e sarete pronti per la connessione a un servizio web che utilizza SSL richiede l'autenticazione del client.
Per generare la richiesta di certificato, l'uso "keytool -certreq -alias -file -keypass -keystore". Inviare il file risultante alla società che sta per firmare.
Quando torni il certificato, eseguire "keytool -importcert -alias -keypass -keystore".
Potrebbe essere necessario -storepass utilizzato in entrambi i casi, se l'archivio di chiavi è protetto (che è una buona idea).
Ecco uno script che ho usato per l'importazione in batch un gruppo di file CRT nella directory corrente in Java keystore. Basta salvare questo nella stessa cartella come il 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 questo ha funzionato per me:
- Salva come .txt i dati del certificato nel seguente formato in un editor di testo
----- BEGIN CERTIFICATE ----- [Dati serializzati da Microsoft] ----- END CERTIFICATE -----
- Apri browser Chrome (questo lavoro passaggio potrebbe anche con altri browser) Impostazioni> Mostra impostazioni avanzate> HTTPS / SSL> Gestisci certificati Importare il .txt nel passaggio 1
- Seleziona e di esportazione che il certificato in Base-64 formato codificato. Salvarlo come cer
- Ora è possibile utilizzare keytool o Portecle importare al vostro java chiavi