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

.
È stato utile?

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 con

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

  1. Vai al tuo java_home\jre\lib\security
  2. ( di Windows ) Allargare la riga di comando di amministrazione non utilizzando cmd e CTRL + SHIFT + INVIO
  3. Esegui keytool per certificato d'importazione:
    • (Sostituire rispettivamente yourAliasName e path\to\certificate.cer)

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

 entrare descrizione dell'immagine qui

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. entrare image description qui

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:

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

    ----- BEGIN CERTIFICATE -----   [Dati serializzati da Microsoft]   ----- END CERTIFICATE -----

  2. 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
  3. Seleziona e di esportazione che il certificato in Base-64 formato codificato. Salvarlo come cer
  4. Ora è possibile utilizzare keytool o Portecle importare al vostro java chiavi
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top