使用Openssl和Client Auth连接到Server的Java客户端

时间:2008-12-22 10:01:14

标签: java ssl openssl

我必须编写一个Java客户端来连接到SSL服务器。服务器使用openssl证书,并配置为执行客户端身份验证。

我似乎无法在网上找到任何有用的资源,可以帮助我(谁不了解有关openssl和SSL的知识)了解谁将实施我的客户端。

帮助!

3 个答案:

答案 0 :(得分:4)

这里的转折是您正在使用客户端身份验证,因此您需要私钥和证书来标识自己。通过在初始化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 propertiesjavax.net.ssl.keyStorejavax.net.ssl.keyStorePassword。这些值应分别是用户密钥库的路径和密钥库的“密钥条目”的密码。

使用这些属性时,您可以创建一个支持客户端身份验证的新SSLSocket,如下所示:

SocketFactory factory = SSLSocketFactory.getDefault();
Socket socket = factory.createSocket(host, port);

由于您使用的是“默认”SSLSocketFactory,这取决于系统范围的属性,因此在JVM中创建的所有套接字都将使用相同的证书进行身份验证。如果您需要更多控制,则必须使用上面的“可自定义设置”。

答案 1 :(得分:1)

Java在标准API中包含SSL支持。在1.5.0 javadoc中查看这些类:

SSLSocket如果您自己正在使用通信逻辑。

HttpsURLConnection如果服务器端说HTTP

答案 2 :(得分:0)

您可以使用httpclient。看看这个SSL guide