Importazione della catena e della chiave del certificato PEM in Keystore Java


29

Ci sono molte risorse là fuori su questo argomento, ma nessuna ho trovato che copre questo caso leggermente speciale.

Ho 4 file;

  • privatekey.pem
  • certificate.pem
  • intermediate_rapidssl.pem
  • ca_geotrust_global.pem

E desidero importarli in un nuovo keystore.

Alcuni siti suggeriscono di utilizzare il formato DER e importarli uno per uno, ma questo non è riuscito perché la chiave non è riconosciuta.

Un altro sito ha suggerito una speciale classe "ImportKey" da eseguire per l'importazione, e questo ha funzionato fino a quando ho visto che la catena era rotta. Vale a dire la lunghezza della catena sul certificato è 1, ignorando l'intermedio e ca.

Alcuni siti suggeriscono PKCS7, ma non riesco nemmeno a ricavarne una catena. Altri suggeriscono il formato PKCS12, ma per quanto riguarda i miei test ha fallito anche per ottenere l'intera catena.

Qualsiasi consiglio o suggerimento è molto gradito.

Risposte:


26

Questo potrebbe non essere perfetto, ma ho avuto alcune note sul mio uso keytoolche ho modificato per il tuo scenario.

  1. Importare un certificato CA intermedio o root in un keystore Java esistente:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Combina il certificato e la chiave privata in un file prima dell'importazione.

    cat certificate.pem privatekey.pem > combined.pem
    

    Ciò dovrebbe comportare un file simile al formato seguente.

    INIZIA CERTIFICATO
    ...
    FINE CERTIFICATO
    INIZIA CHIAVE PRIVATA RSA
    ...
    FINE CHIAVE PRIVATA RSA

  3. Importa un certificato primario e una chiave firmati in un keystore Java esistente:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    

2
Quale versione di keytool ti consente di concatenarti in questo modo? Questa sintassi fornisce "errore keytool: java.lang.Exception: certificato non importato, l'alias <root> esiste già" con -import e -importcert
ctpenrose il

Difficile da dire, esattamente. Ma dato l'anno / mese probabilmente era Java 6? (Non ho idea della versione minore.) Quale versione stai usando? L'errore sembra che il problema potrebbe riguardare il keystore stesso. ( alias <root> already exists) Puoi provare con un nuovo keystore vuoto?
Aaron Copley,

1
Keytool non mi consente di importare un certificato utilizzando un alias "root" già esistente. Ma penso che sia stato un errore di battitura. È interessante notare che keytool crea una catena per il certificato stesso quando trova i certificati dei firmatari nel keystore (sotto qualsiasi alias). Lo strumento Java "Portecle" è utile per la gestione del keystore java.
Houtman,

Keytool non funziona in questo modo e non consente di importare un alias più di una volta come descritto. (E sì, ci ho provato). Vedi la risposta di senajqerib di seguito per qualcosa che funzioni correttamente.
Steve Sether,

1
È una risposta di tre anni. È del tutto possibile che le cose siano cambiate, ma ti assicuro che ha funzionato (o era vicino a funzionare come ho indicato, potrebbe non essere perfetto) a partire da febbraio 2013. Sentiti libero di inviare una modifica o contrassegnarla per l'attenzione del moderatore.
Aaron Copley,

42

Concatena tutti i file * .pem in un unico file pem, come all.pem Quindi crea un keystore in formato p12 con chiave privata + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Quindi esportare p12 in jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks

Grazie. Questa è l'unica risposta completa e corretta. Come hai suggerito, è molto più semplice concatenare le certs in un unico file.
Steve Sether,

Questo ha funzionato come un piacere per me !! Ho usato queste istruzioni per convertire una catena di chiavi utilizzata nel repository di esempi di certificato autofirmato nodejs per parlare con un server TLS basato su Java. Grazie mille!
Galder Zamarreño,

Questa è la risposta corretta
sfThomas

8

keytool non fornisce un modo per importare certificato + chiave privata da un singolo file (combinato), come proposto sopra. Funziona bene, ma viene importato solo il certificato, mentre la chiave privata viene ignorata. Puoi verificarlo tramite keytool -list -v -keystore yourkeystore.jks: il tipo di voce del tuo dominio è TrustedCertEntry, non PrivateKeyEntry.

Quindi, per risolvere il problema iniziale, si dovrebbe prima creare un keystore PKCS # 12 usando openssl (o uno strumento simile), quindi importare il keystore con keytool -importkeystore.

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.