2011-06-16 94 views
24

我們可以加載多個證書&密鑰存儲在密鑰庫中嗎?我們可以在密鑰庫中加載多個證書和密鑰嗎?

它是否總是隻需要加載成對(即證書&鑰匙在一起)?

如果密鑰庫有多個證書和密鑰,當Java SSL嘗試建立與服務器的連接時將選擇哪個證書和密鑰?

回答

15

雖然這取決於KeyStore類型,但通常情況下,您可以將多個私鑰和證書存儲在單個存儲中。

基於Java的服務器使用哪種密鑰和證書組合取決於應用程序的實現方式。許多應用程序允許您使用別名名稱來選擇給定的證書。 KeyStore中的密鑰和證書獲取器採用alias參數進行此選擇。通常,當配置中未指定此項時,應用程序或框架將根據KeyStore.aliases()枚舉使用找到的第一個適合的應用程序或框架。

Tomcat的,例如,使用keyAlias屬性在其Connector configuration

keyAlias:用於爲在密鑰庫服務器 證書的別名。如果沒有指定 ,則將使用在 密鑰庫中讀取的第一個密鑰。

關於密鑰對,一些的KeyStore(再次,根據類型)可被用來存儲SecretKey秒(例如DES),即共享密鑰,以及公共 - 私有密鑰對。

+1

感謝您的回答。所以,基本上在Java SSL中,如果要使用證書,那麼首先我必須通過Keytool或以編程方式將它們加載到KeyStore中,然後從密鑰存儲區讀取證書和私鑰條目並將它們傳遞SSL?但是,哪個API允許我指定SSL服務器使用哪個證書? – Jay 2011-06-16 15:10:39

+2

除非你使用的框架爲你做,否則你需要配置一個'KeyManager'並初始化和'SSLContext'(然後使用該上下文來構建你的套接字工廠)。以下是[KeyManager指定別名]的示例(http://code.google.com/p/jsslutils/source/browse/tags/release-1.0.5/jsslutils/src/main/java/org/jsslutils /sslcontext/keymanagers/FixedServerAliasKeyManager.java)。 – Bruno 2011-06-16 15:17:36

+0

@布魯諾:你確定它在查看這個別名嗎?因爲別名是您爲了在密鑰庫中標識該條目而給出的名稱。爲了選擇它應該發送給客戶的證書,它將查看證書(CN)的域名,並根據該域名作出決定。如果在任何一個證書的(CN)中找到所請求的域,該證書將被髮送給客戶端。 – Ashwin 2012-04-19 02:17:04

2

您可以擁有一個擁有儘可能多的證書和密鑰的密鑰庫。

如果在客戶端用作其信任庫的密鑰庫中有多個證書,則會查看所有證書,直到找到適合的證書爲止。您可以查看預安裝的證書,它們位於/ lib/security/cacerts中。它只是一個根CA的證書的大集合。

關於我不知道的鑰匙。我認爲客戶端使用的是由同一CA簽名的密鑰作爲服務器提供的證書,如果有多個,則使用第一個。但我無法確定。