在我的Java應用程序中,我需要使用SSL連接到相同的主機,但每次都使用不同的證書。我需要使用不同證書的原因是,遠程站點使用嵌入在證書中的用戶標識屬性來標識客戶端。在同一主機上使用Java中的多個SSL客戶端證書
這是一個運行在3個不同操作系統上的服務器應用程序,我需要能夠在不重新啓動進程的情況下切換證書。
Another user建議將多個證書導入到同一密鑰庫中。但我不確定這對我有幫助,除非有辦法告訴Java密鑰庫中的哪個證書要使用。
在我的Java應用程序中,我需要使用SSL連接到相同的主機,但每次都使用不同的證書。我需要使用不同證書的原因是,遠程站點使用嵌入在證書中的用戶標識屬性來標識客戶端。在同一主機上使用Java中的多個SSL客戶端證書
這是一個運行在3個不同操作系統上的服務器應用程序,我需要能夠在不重新啓動進程的情況下切換證書。
Another user建議將多個證書導入到同一密鑰庫中。但我不確定這對我有幫助,除非有辦法告訴Java密鑰庫中的哪個證書要使用。
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,可以根據您對密碼套件的偏好來配置套接字,更容易。
有一個解決方案here用於從Axis客戶端動態選擇用於SSL身份驗證的客戶端證書。
「的Java 6已經一些額外的API,可以更容易地根據自己的喜好進行加密套件配置插座」 你能指出我的這些配置上更多的文件/討論? – Tazzy531 2010-07-13 21:07:28