2009-05-20 51 views
6

在我的Java應用程序中,我需要使用SSL連接到相同的主機,但每次都使用不同的證書。我需要使用不同證書的原因是,遠程站點使用嵌入在證書中的用戶標識屬性來標識客戶端。在同一主機上使用Java中的多個SSL客戶端證書

這是一個運行在3個不同操作系統上的服務器應用程序,我需要能夠在不重新啓動進程的情況下切換證書。

Another user建議將多個證書導入到同一密鑰庫中。但我不確定這對我有幫助,除非有辦法告訴Java密鑰庫中的哪個證書要使用。

回答

11

SSL可以向客戶提供有關要呈現哪個證書的提示。這可能允許您使用其中有多個身份的一個密鑰存儲區,但不幸的是,大多數服務器不使用此提示功能。因此,如果您爲每個連接指定要使用的客戶端證書,它將更加健壯。

以下是使用指定的身份和信任庫設置一個SSLContext的示例代碼。您可以重複這些步驟來創建多個上下文,其中一個用於您要使用的每個客戶端證書。每個SSLContext可能會使用相同的信任存儲,但使用不同的身份存儲(包含要在該上下文中使用的單個客戶端密鑰條目)。

初始化您將需要一次的上下文,併爲每個連接重新使用正確的上下文。如果您正在進行多個連接,這將允許您利用SSL會話。

KeyManagerFactory kmf = 
    KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
kmf.init(identityStore, password); 
TrustManagerFactory tmf = 
    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(trustStore); 
SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

後來,你可以直接創建一個套接字:

SSLSocketFactory factory = ctx.getSocketFactory(); 
Socket socket = factory.createSocket(host, port); 

或者,如果您使用的是URL類,你可以指定SSLSocketFactory進行HTTPS請求時使用:

Java 6具有一些額外的API,可以根據您對密碼套件的偏好來配置套接字,更容易。

+0

「的Java 6已經一些額外的API,可以更容易地根據自己的喜好進行加密套件配置插座」 你能指出我的這些配置上更多的文件/討論? – Tazzy531 2010-07-13 21:07:28

0

有一個解決方案here用於從Axis客戶端動態選擇用於SSL身份驗證的客戶端證書。