2010-01-13 12 views
19

Ran in un altro problema utilizzando SSL e Tomcat: ho configurato un keystore che contiene una chiave e un certificato (il certificato del server che desidero presentare ai client che si collegano al sito). Ho fatto lo stesso per il truststore (avrò bisogno dell'autenticazione del client).Tomcat HTTPS certificato keystore

Il problema che ho ora è che quando mi collego alla mia istanza di Tomcat tramite HTTPS, il certificato presentato a me (il certificato del server) non è il mio certificato server vero e proprio, ma piuttosto la chiave nel keystore JKS. L'utilizzo di -Djavax.net.debug = ssl rivela che sta presentando la CA corretta per l'autenticazione del client, ma non il certificato del server corretto.

adding as trusted cert: 
    Subject: CN=A 
    Issuer: CN=A 
    Algorithm: RSA; Serial number: - 
    Valid from Tue Nov 10 14:48:31 CET 2009 until Mon Feb 08 14:48:31 CET 2010 

adding as trusted cert: 
    Subject: X 
    Issuer: X 
    Algorithm: RSA; Serial number: - 
    Valid from Wed Jan 19 01:00:00 CET 2005 until Mon Jan 19 00:59:59 CET 2015

Ho sostituito i valori reali con i segnaposto. A = il nome di dominio del server (ma in questo caso, per qualche motivo questa è la chiave e non il certificato). X = una VeriSign CA (dovrebbe essere corretta). Ho un certificato esistente che vorrei usare per presentare ai client, che ho importato in un keystore JKS usando keytool.

La configurazione del connettore Tomcat:

 
Connector port="444" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true" 
clientAuth="false" sslProtocol="TLS"  
keystoreFile="conf/ssl/keystore.jks" 
keystorePass="xx" 
keyAlias="testkey" 
truststoreFile="conf/ssl/truststore.jks" 
truststorePass="xx"

Qualsiasi idea del perché la mia istanza di Tomcat non presenta il certificato corretto?

+0

fornire la configurazione del connettore ssl (da server.xml) – Bozho

risposta

15

Il problema è (apparentemente - non posso davvero confermare) che è impossibile importare correttamente un certificato generato in precedenza (e chiave corrispondente) in un keystore JKS e presentarlo correttamente da Tomcat.

La situazione in cui si è verificato il mio problema è il seguente:

  1. Ho un file di certificato, che io stesso ho generato usando OpenSSL da zero (tasto + CSR -> certificato), firmato dalla mia stessa CA.
  2. Desidero configurare Tomcat in modo che presenti questo particolare certificato agli utenti che si collegano al mio sito.

La soluzione che ho trovato al lavoro è:

  1. convertire il certificato esistente e la sua chiave privata per il formato DER.Ad esempio (utilizzando OpenSSL):

    Per la chiave privata ;

    openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER

    Per l'attuale certificato firmato;

    openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER

  2. Import entrambi i file DER in un archivio di chiavi (file JKS) utilizzando una classe Java personalizzata.

    java ImportKey my_private_key.der my_certificate.der

    non ho questo numero me stesso (tutto il merito va a l'inventore originale (s)). La fonte per questa classe Java, e qualche dettaglio in più può essere trovato here e here. Ho modificato leggermente questa classe in modo che sia presente un terzo (o quarto) parametro che specifica la posizione di output del file JKS risultante.

Il risultato finale è un archivio chiavi JKS che può quindi essere utilizzato nella configurazione Tomcat connettore come chiavi. Lo strumento sopra genera il file JKS con password di default per la chiave e JKS file stesso, questi possono essere modificati in seguito utilizzando keytool -storepasswd e keytool -keypasswd. Spero che questo aiuti le persone che affrontano lo stesso problema.

+2

+1. Il secondo link (agentbob.info) ha funzionato per me. Emette una password per il keystore che il primo link (comu.de) non ha. Il keytool di Java non ama cambiare la password di un keystore senza password. Inoltre, è possibile specificare l'alias chiave che tomcat si aspetta (è "tomcat"). – Wolfgang

3

La configurazione dovrebbe funzionare correttamente.

Tomcat's how-to spiega i passaggi da eseguire per avere un JKS corretto.

Assicurarsi di aver importato il certificato al JKS, con l'alias appropriato (TestKey)

+0

Quando si imposta keyAlias ​​sull'alias del certificato nel keystore, Tomcat non si avvierà correttamente. Sto assumendo che i parametri chiave di Alias ​​siano usati per specificare la chiave, non il certificato. Ho la sensazione che Tomcat non potrà mai presentare correttamente il mio certificato, perché è stato creato separatamente. In questo momento ho intenzione di provare a generare un nuovo certificato da zero utilizzando keytool invece di openssl, e vedere se questo fa la differenza. – tmbrggmn

+1

sì, provalo. La chiave e il certificato, come si può vedere nel tomcat, devono essere sotto lo stesso alias. – Bozho

+0

Il mio precedente tentativo non è riuscito. Sto facendo qualcosa di sbagliato, ma non so cosa. È anche possibile presentare un certificato esistente o devi usare keytool per generarne uno nuovo? Questo è confusionario. – tmbrggmn

2

Ampliando @Bozho commento,

questo era davvero critica. "La chiave e il certificato acquistato devono essere sotto lo stesso alias".

Il certificato SSL acquistato dal CA (Verisign, Digicert ecc) deve essere importato con lo stesso alias la chiave privata generata prima di creare il CSR. Dopo aver importato il certificato acquistato nell'archivio chiavi utilizzando Java keytool, si vedrà "La risposta del certificato aggiunto al keystore".

Per controllare la catena di fiducia, utilizzare il comando di terminale openssl s_client -connect yourdomain.com:443 -showcerts. Inizia dal tuo cert e porta a una CA radice affidabile.