java openssl_Java客户端使用Openssl和客户端身份验证连接...

这里的问题是您正在使用客户端身份验证,因此您需要私钥和证书来标识自己.您可以在初始化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中创建的所有套接字都将使用相同的证书进行身份验证.如果您需要更多控制,则必须使用上面的“可自定义设置”.


版权声明:本文为weixin_36216477原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。