我必须编写一个Java客户端来连接到SSL服务器。服务器使用openssl证书,并配置为执行客户端身份验证。
我似乎无法在网上找到任何有用的资源,可以帮助我(谁不了解有关openssl和SSL的知识)了解谁将实施我的客户端。
帮助!
答案 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 properties为javax.net.ssl.keyStore
和javax.net.ssl.keyStorePassword
。这些值应分别是用户密钥库的路径和密钥库的“密钥条目”的密码。
使用这些属性时,您可以创建一个支持客户端身份验证的新SSLSocket,如下所示:
SocketFactory factory = SSLSocketFactory.getDefault();
Socket socket = factory.createSocket(host, port);
由于您使用的是“默认”SSLSocketFactory
,这取决于系统范围的属性,因此在JVM中创建的所有套接字都将使用相同的证书进行身份验证。如果您需要更多控制,则必须使用上面的“可自定义设置”。
答案 1 :(得分:1)
答案 2 :(得分:0)
您可以使用httpclient。看看这个SSL guide。