
我使用以下命令創建了密鑰對:
"%JAVA_HOME%\bin\keytool" -genkeypair -keysize 2048 -alias tomcat -keyalg RSA -sigalg SHA256withRSA
我注意到 jdk/lib/security 資料夾中有一個密鑰存儲,jre/lib/security 資料夾中有另一個密鑰存儲。我假設其中一個儲存的將保存我剛剛建立的密鑰對。金鑰對是在預設金鑰庫中建立的,該金鑰庫是在登入使用者目錄中建立的。
我的第一個問題是為什麼預設密鑰庫位於使用者目錄中?這看起來很奇怪。我可以移動那個金鑰庫嗎?
我的第二個問題是為什麼有這麼多密鑰庫?
我的最後一個問題是,由於我的密鑰對是預設儲存中的唯一密鑰,我是否應該將其移動/複製到其他地方?我需要 ICA 對其進行簽名,因此它本身似乎不正確。
答案1
Java 會在每次更新時覆蓋預設金鑰庫(好吧,大多數時候它會安裝在新位置並刪除先前的位置),因此每次更新套件時,它都會刪除使用者建立的任何私密金鑰(因為更新可能還包含對預設信任庫的變更以刪除不受信任的 CA 等),因此預設(也是最明智的方式)是將內容儲存在使用者的資料夾中。這樣它就可以與更新隔離。此外,如果同一台電腦上的每個使用者都可以存取任何其他使用者的私鑰或操縱預設信任庫以允許自訂 CA,這將是一個安全問題。
Windows 憑證的行為方式類似:預設顯示目前使用者的個人儲存。新的私鑰或受信任的憑證只會影響當前用戶,但電腦仍將具有 Windows 附帶的預設設定(每次更新都會更改這些預設設置,例如新 CA 或不受信任的預設)。
使用者所做的事情不應影響同一台電腦上的任何其他使用者。
至於JRE和JDK,前者是為了環境running
(即為了應用程式的標準使用),後者是為了development
不同的需求。應用程式伺服器需要 JDK,因為它需要*.jsp
動態「編譯」這類頁面。 JDK 包含它自己的 JRE,因此它擁有 JRE 工作所需的所有內容的自己的副本。由於您可能需要為客戶端(使用者)提供與伺服器不同的支援(即 JRE 和 JDK 可能使用不同的版本),因此共用公共部分可能會產生幹擾。
您可以在鍵入的相同命令中變更金鑰庫(名稱和位置)-keystore file.jks
,但您需要在任何其他命令或設定中引用相同的文件,以便 java 使用相同的金鑰庫。由於您已命名 alias tomcat
,我假設您將使用它作為應用程式伺服器的金鑰庫,因此在 server.xml (或 catalina.xml)檔案中,您需要配置金鑰庫位置。
伺服器的金鑰庫應位於具有受限存取權的目錄中(僅可由執行伺服器的使用者讀取),例如/etc/ssl/
等等。
至於文件本身的內容,當您需要對其進行簽名時,首先是創建一個自簽名金鑰對(就像您所做的那樣),然後創建一個 CSR(證書簽名請求)以發送到 CA。之後,您應該將整個鏈(新簽署的憑證和 CA 的憑證鏈)匯入到同一金鑰庫中的相同別名。這仍然是金鑰庫中的單一條目,但在該別名下將有多個憑證(和私鑰)。
如果您的伺服器不需要連接到另一台伺服器,則該金鑰庫不應包含任何其他憑證。即使需要,您也應該有一個單獨的信任庫(第二個金鑰庫,但其中僅包含 CA,就像 cacerts 檔案一樣)(或依賴 JRE 的預設信任庫,甚至將 CA 包含在相同的金鑰庫)。