2013-07-17 149 views
67

我使用以下步驟創建了一個新的Java密鑰庫,其中包含一對私鑰/公鑰,以供Java(內部)服務器使用TLS使用。請注意,該證書是自簽名:在Java KeyStore中導入私鑰/公鑰證書

1)生成密鑰與AES256

openssl genrsa -aes256 -out server.key 1024 

2)生成CA

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

3)生成自簽名的到期時間的證書請求10年

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

4)使用像KeyStoreExplorer這樣的程序來導入對(私有te密鑰和自簽名證書)在一個新的JKS

這個工程,但我想實施最後一步,而不使用GUI。

我知道如何導入只有自簽名證書:

// 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 

所以,問題是:我怎麼可以創建一個Java密鑰和進口均與公鑰證書和私鑰不使用GUI?

+1

也許這個「ImportKey」Java程序將爲你做這項工作,而無需GUI:http://www.agentbob.info/agentbob/79-AB.html – sk2212

+0

如果目標系統是Java,則不需要使用完全是OpenSSL,只是keytool。請參閱「JSSE參考指南」或keytool的工具文檔。 – EJP

回答

162

使用您的私鑰和公共證書,您需要先創建一個PKCS12密鑰庫,然後將其轉換爲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 

要驗證JKS的內容,你可以使用這個命令:

keytool -list -v -keystore mykeystore.jks 

如果這不是自簽名的證書,你可能會想按照此步驟與導入證書產生可信的CA證書。

+10

http://stackoverflow.com/a/8224863/183622顯示了一個更徹底的示例,包括CA證書和鏈接保存(如果需要的話) –

0

密鑰庫需要密鑰庫文件。 KeyStore課程需要FileInputStream。但是,如果您提供null(而不是FileInputStream實例)empty keystore will be loaded。創建密鑰庫後,您可以使用keytool驗證其完整性。

下面的代碼創建一個空的密鑰庫用空密碼

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

一旦你的密鑰庫,導入證書是很容易的。請訪問this link查看示例代碼。

+0

沒有必要編寫任何代碼來完成此操作。您引用的鏈接包含重大錯誤。 – EJP

+0

@EJB,我在博客上看到您的評論。我同意沒有必要編寫任何代碼來完成此操作。但是,如果它必須以編程方式完成? – Santosh

+1

另外,你關於'InpputStream.available()'的觀察是正確的,但是我看到'FilterInputStream的文檔。available()'說_返回可以從這個輸入流中讀取(或跳過)的字節數的估計值,並且沒有警告!在示例中(在博客中),'DataInputStream.available()'在任何地方都被使用,'FilterInputStream'由'DataInputStream'擴展。在這種特殊情況下使用'available()'不是安全的嗎? – Santosh