2017-08-05 107 views
0

只想問這個問題的「澄清」,而不是一個分辨率時,密鑰工具命令:導入證書或鏈

Java的密鑰工具與-trustcacerts ARG的-importcert命令。從官方的幫助指南。

導入來自CA

該認證答覆後您導入認證的 您提交證書籤名請求(該CA的公鑰證書或有 已經這樣一個證書cacerts文件),您可以導入 證書回覆,並將您的自簽名證書替換爲 證書鏈。此鏈是構成由CA在 響應返回到您的請求的一個(當CA答覆是鏈),或一種 (當CA答覆是單個證書)使用已經在 認證答覆和受信任的證書在您導入答覆的密鑰庫中或在cacerts密鑰庫 文件中可用 。

例如,如果您發送您的證書籤名請求,威瑞信, 那麼你可以導入使用以下的答覆,這假設 返回的證書名爲VSMarkJ.cer:

keytool -importcert -trustcacerts -file VSMarkJ.cer

我也看了跟隨着從keytool文檔:

如果回答是一個X.509證書,密鑰工具學嘗試ts到 建立信任鏈,從證書回覆開始,並在自簽名證書(屬於根CA)結束 。證書 回覆和用於認證 證書回覆的證書層次結構形成了新的證書鏈別名。如果不能建立信任鏈,則不會導入證書回覆。在 這種情況下,密鑰工具不打印出證書並提示 用戶進行驗證,因爲它是非常硬的(如果不是不可能的),用於一個用戶 以確定證書的回覆的真實性。

如果答覆是PKCS#7格式的證書鏈,該鏈是第一 排序(與用戶證書第一和自簽名的根CA 證書最後一個),前密鑰工具試圖根CA 證書匹配在密鑰庫或「cacerts」密鑰庫文件(如果指定了-trustcacerts 選項)中的任何可信證書 的答覆中提供。如果沒有匹配,可以發現,的 根CA證書的信息被打印出來,並且用戶被提示 驗證,例如,通過比較所顯示的證書指紋 與來自一些其他(可信)源獲得的指紋 信息,這可能是根CA本身。用戶然後有中止導入操作的 選項。但是,如果-noprompt選項爲 ,則不會與用戶進行交互。

如果我收到這兩個根CA和我的簽名證書,哪一個是正確的命令對我來說,正確導入證書(或將所有下面工作的基礎上根CA的可用性)的認證答覆:

# Assuming doesn't exist at all 
keytool -import -keystore server_keystore.jks -storepass pass -alias rootCA -file ca-cert-file 
keytool -import -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert 

VS

#Assuming that root CA exists in system-wide cacerts 
keytool -import -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert 

# Assuming that the root CA doesn't exist 
keytool -importcert -keystore java_home\jre\lib\security\cacerts -storepass changeit -alias someRootCA -file root_ca_cert 
keytool -importcert -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert 

對不起,任何不正確的假設,只是想與他人:)

問候合作,理解,

+0

當你嘗試時發生了什麼?如果你只有一個文件回覆,#1和#3可能如何相關?他們都使用兩個文件。 – EJP

+0

@EJP好吧我錯過了一個改變 - 現在更新了問題。謝謝。我的信任庫cacerts受到了損壞(我認爲),因爲我在服務器密鑰庫和信任庫中使用了「-trustcacerts」。只是想了解如何不搞亂順序。我使用'openssl s_client'命令來檢查服務器在打印出大量證書信息時的行爲,但沒有實際的數據寫入/讀取測試。 – ha9u63ar

回答

2
# Assuming doesn't exist at all 
keytool -import -keystore server_keystore.jks -storepass pass -alias rootCA -file ca-cert-file 
keytool -import -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert 

這是使用一個。第一個選項需要-trustcacerts選項,或者在相應的提示符下輸入'yes'。

#Assuming that root CA exists in system-wide cacerts 
keytool -import -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert 

這會工作如果簽署你是cacerts證書。通常情況並非如此:根證書應該在那裏,但可能他們用一個三級或三級以上的證書籤名。

# Assuming that the root CA is a new authority 
keytool -importcert -keystore java_home\jre\lib\security\cacerts -storepass changeit -alias someRootCA -file root_ca_cert 
keytool -importcert -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert 

在理論上看起來不錯,但如果CA是一個新的權威,沒有其他人會信任它,所以這是徒勞的。

請注意,導入簽名證書時,必須使用您在生成密鑰對和CSR時使用的密鑰庫文件和別名。這是錯誤的常見來源。

+0

感謝您的回答 - 我試圖理解您的意思是「您需要-trustcacerts第一個,作爲選項或作爲對提示的回覆」。假設沒有中間CA證書存在,是不是'-trustcacerts'意思是說「通過查看系統範圍的cacerts文件來建立此證書的信任鏈?」如果你能夠詳細闡述這個說法,那將是非常酷的。 – ha9u63ar

+0

是的。如果你不提供它,'keytool'會詢問你是否要信任這些證書,並且你必須回答'是'。 – EJP

+0

令人敬畏的工作。謝謝。是的,別名可以搞砸 – ha9u63ar