这里的问题是您正在使用客户端身份验证,因此您需要私钥和证书来标识自己.您可以在初始化SSLContext时通过指定KeyManagers将其提供给JSSE.
可自定义的设置
以下是基本步骤. JSSE API在Java 6中得到了显着改进,但是我坚持使用Java 5,以防您停留在该版本上.
KeyStore tks = KeyStore.getInstance(KeyStore.getDefaultType());
tks.load(...); /* Load the trust key store with root CAs. */
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(tks);
KeyStore iks = KeyStore.getInstance(KeyStore.getDefaultType());
iks.load(...); /* Load the identity key store with your key/cert. */
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(iks, password);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
SocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, port);
系统配置
使用SunJSSE提供程序时,可以使用另一种“零配置”方案.我相信许多其他提供商(例如IBM)也遵循相同的模式,并且也将正常工作.该机制使用system properties,,并由JSSE Reference Guide.详细描述
对于客户端身份验证,important properties是javax.net.ssl.keyStore和javax.net.ssl.keyStorePassword.这些值应该分别是用户密钥库的路径和该密钥库的“密钥条目”的密码.
使用这些属性时,可以创建一个支持客户端身份验证的新SSLSocket,如下所示:
SocketFactory factory = SSLSocketFactory.getDefault();
Socket socket = factory.createSocket(host, port);
由于您使用的是“默认” SSLSocketFactory(取决于系统范围的属性),因此在JVM中创建的所有套接字都将使用相同的证书进行身份验证.如果您需要更多控制,则必须使用上面的“可自定义设置”.