2013-07-17 11 views
67

Ho utilizzato i seguenti passaggi per creare un nuovo keystore Java con una coppia di chiavi private/pubbliche che verranno utilizzate da un server Java (interno) con TLS. Si prega di notare che il certificato sia autofirmato:Importazione della coppia chiave privata/certificato nel KeyStore Java

1) chiave Generare con AES256

openssl genrsa -aes256 -out server.key 1024 

2) Generare richiesta del CERT per CA

openssl req -x509 -sha256 -new -key server.key -out server.csr 

3) Generare auto firmato scadenza a tempo 10 anni

openssl x509 -sha256 -days 3652 -in server.csr -signkey server.key -out selfsigned.crt 

4) Utilizzare un programma come KeyStoreExplorer importare la coppia (Priva te chiave e certificato autografo) in un nuovo JKS

Questo funziona ma vorrei implementare l'ultimo passaggio senza utilizzare una GUI.

so come importare il certificato autofirmato solo:

// create the keystore and import the public key. THIS WILL NOT IMPORT THE PRIVATE KEY SO THE KEYSTORE CAN'T BE USED ON THE SERVER TO MAKE THE TLS CONNECTION 
/usr/java/jdk1.6.0_45/bin/keytool -import -alias myservercert -file server.crt -keystore mykeystore.jks 

Quindi la domanda è: come posso creare un chiavi Java e l'importazione sia il certificato con la chiave pubblica e la chiave privata senza utilizzare un GUI?

+1

Forse questo programma Java "ImportKey" farà il lavoro per voi senza una GUI: http://www.agentbob.info/agentbob/79-AB.html – sk2212

+0

Se il sistema di destinazione è Java non è necessario utilizzare OpenSSL a tutti, solo il keytool. Vedere ad esempio la Guida di riferimento JSSE o la documentazione dello strumento per il keytool. – EJP

risposta

162

Con la chiave privata e il certificato pubblico, è necessario creare prima un keystore PKCS12, quindi convertirlo in un JKS.

# Create PKCS12 keystore from private key and public certificate. 
openssl pkcs12 -export -name myservercert -in selfsigned.crt -inkey server.key -out keystore.p12 

# Convert PKCS12 keystore into a JKS keystore 
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias myservercert 

Per verificare il contenuto dei JKS, è possibile utilizzare questo comando:

keytool -list -v -keystore mykeystore.jks 

Se questo non era un certificato auto-firmato, probabilmente si vuole seguire questo passaggio con l'importazione del certificato catena che porta al certificato CA di fiducia.

+10

http://stackoverflow.com/a/8224863/183622 mostra un esempio più completo che include certificati CA e conservazione della catena, se necessario –

0

Un archivio di chiavi richiede un file di archivio di chiavi. La classe KeyStore ha bisogno di un FileInputStream. Ma se si fornisce null (invece dell'istanza FileInputStream) uno empty keystore will be loaded. Una volta creato un keystore, è possibile verificarne l'integrità utilizzando keytool.

codice seguente crea un archivio chiavi vuota con password vuota

KeyStore ks2 = KeyStore.getInstance("jks"); 
    ks2.load(null,"".toCharArray()); 
    FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore"); 
    ks2.store(out, "".toCharArray()); 

volta che hai la chiavi, importare il certificato è molto facile. Acquista this link per il codice di esempio.

+0

Non è necessario scrivere alcun codice per ottenere ciò. Il link citato contiene errori significativi. – EJP

+0

@ EJB, ho visto il tuo commento sul blog. Sono d'accordo che non è necessario scrivere alcun codice per realizzare questo. Ma, nel caso in cui deve essere realizzato a livello di programmazione? – Santosh

+1

Inoltre, la tua osservazione su 'InpputStream.available()', è corretta, ma vedo che la documentazione di 'FilterInputStream.available() 'dice _Ritorna una stima del numero di byte che possono essere letti (o ignorati) da questo flusso di input_ e non c'è alcun avviso! Nell'esempio (nel blog), 'DataInputStream.available()' è usato ovunque e 'FilterInputStream' è esteso da' DataInputStream'. Non dovrebbe essere sicuro usare 'available()' in questo caso particolare? – Santosh