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类,则可以指定在发出HTTPS请求时使用的SSLSocketFactory:
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ctx.getSocketFactory());
Java 6有一些额外的API,可以根据您对密码套件等的偏好更容易地配置套接字.