我有一個 java 金鑰庫,其中已安裝 2 個憑證鏈。 CSR 由 CA 產生並簽名,並且安裝了具有相應 CA 的憑證。但是,當我向連接埠上的應用程式發送請求時,僅顯示一個證書,但我希望顯示密鑰庫中的兩個證書,以便我可以根據首選證書進行身份驗證。
我需要這方面的幫助
答案1
旁白:CA 不簽署 CSR;它簽署了一個證書,該證書是部分地基於企業社會責任,但部分不是(這兩部分都很重要)。
你說 'A企業社會責任已產生」。如果您確實建立了一個CSR(針對一個金鑰)並為該CSR 取得了兩個憑證(每個可能帶有鏈),並將兩個憑證鏈安裝到商店中的一個私鑰條目中,那麼第二個證書鏈將替換第一個證書鏈,您只需您的商店裡有第二個。
我假設您產生了兩個私鑰和兩個CSR(每個金鑰一個),並且對於每個CSR 都有一個憑證鏈並將其安裝到對應的私鑰,因此您實際上有兩個具有不同證書鏈的私鑰並且希望查看兩者。如有疑問,請keytool -list [-v]
進行檢查。
SSL(現在的 TLS)協定不會這樣做;伺服器僅發送一個「實體」(伺服器)憑證及其鏈憑證(如果有),並在一次握手中證明相應的私鑰。
你可能能夠執行兩個請求,每個請求都會得到一您想要的憑證鏈:
如果憑證具有不同的主題/SAN 名稱,而您的用戶端使用SNI 擴充功能(最近的瀏覽器會這樣做,但其他軟體可能會也可能不會),那麼Java 8 伺服器將偏好與SNI 相符的憑證。大多數客戶端(但不是 OpenSSL!)始終使 SNI 與連接到的主機名稱相同,因此您可能需要(暫時?)更改名稱解析以將多個主機名稱指向同一伺服器,例如使用您的
hosts
檔案或未綁定定或類似的文件。如果憑證適用於不同的金鑰類型(RSA、DSA、EC),且用戶端僅提供使用一種金鑰類型的密碼套件,則 Java 伺服器將使用該金鑰類型的憑證。有些客戶端允許您輕鬆控制所提供的密碼套件,有些則不然。
同樣,如果憑證鏈使用不同(多組)簽章演算法,且用戶端使用 SignatureAlgorithms 擴充實作 TLS1.2,則 Java 7+ 伺服器會偏好滿足 SigAlgs 的憑證鏈。但我不知道有哪個客戶端可以讓您輕鬆選擇 SigAlgs,而且 CA 幾乎沒有提供在其頒發的憑證鏈中使用哪些簽署演算法的選擇。