SSL分为单向认证和双向认证。单向认证是客户端信任服务端,双向认证是客户端既要信任服务端而且服务端也要信任客户端。
不管是客户端还是服务端,都要存以下两样keystore
KeyStore:保存自己的公钥和私钥。
Trust KeyStore:保存对方的公钥证书。
如果是单向认证,服务器端的KeyStore存储自己的公钥和私钥,客户端的Trust KeyStore要导入服务器端的公钥证书。
如果是双向认证,在上面的基础上,客户端的KeyStore存储自己的公钥和私钥,服务器端的Trust KeyStore要导入客户端的公钥证书。
以上4个KeyStore可以通过以下命令生成:
keytool -genkey -alias serverkey -keystore server.keystore
keytool -export -alias serverkey -keystore server.keystore -file server.crt
keytool -import -alias serverkey -file server.crt -keystore tclient.keystore
keytool -genkey -alias clientkey -keystore client.keystore
keytool -export -alias clientkey -keystore client.keystore -file client.crt
keytool -import -alias clientkey -file client.crt -keystore tserver.keystore
最后看下代码实现,主要通过SSLContext对象的init方法载入KeyStore
void javax.net.ssl.SSLContext.init(KeyManager[] km, TrustManager[] tm, SecureRandom random) throws KeyManagementException
如果是单向认证,需要配置服务端的km和客户端的tm。如果是双向认证,需要配置服务端的km、tm和客户端的km、tm四个KeyStore。
完整代码
服务端
public class SSLServer { private SSLServerSocket serverSocket; private int PORT = 8443; private String workPath = SSLServer.class.getClass().getResource("/").getPath()+"com/test/coder/ssl/"; private String serverKeyStorePath = workPath+"server.keystore"; private String SERVER_KEY_STORE_PASSWORD = "123456"; private String serverTrustKeyStorePath = workPath+"tserver.keystore"; private String SERVER_TRUST_KEY_STORE_PASSWORD = "123456"; public SSLServer() { try { KeyStore ks = KeyStore.getInstance("JKS"); // 创建JKS密钥库 ks.load(new FileInputStream(serverKeyStorePath), SERVER_KEY_STORE_PASSWORD.toCharArray()); // 创建管理JKS密钥库的X.509密钥管理器 KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray()); KeyStore tks = KeyStore.getInstance("JKS"); tks.load(new FileInputStream(serverTrustKeyStorePath), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(tks); SSLContext sslContext = SSLContext.getInstance("SSLv3"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); // 根据上面配置的SSL上下文来产生SSLServerSocketFactory,与通常的产生方法不同 SSLServerSocketFactory factory = sslContext.getServerSocketFactory(); serverSocket = (SSLServerSocket) factory.createServerSocket(PORT); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void start(){ while(true){ try { SSLSocket socket = (SSLSocket)serverSocket.accept(); InputStream in =socket.getInputStream(); OutputStream out = socket.getOutputStream(); byte[] b = new byte[5]; in.read(b); System.out.println(new String(b)); in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { SSLServer sslServer = new SSLServer(); sslServer.start(); } }
相关推荐
java实现 SSL双向认证,java ssl包使用
主要介绍了Java实现SSL双向认证的方法,实例分析了ssl认证的原理与相关实现技巧,需要的朋友可以参考下
全英文,用Java实现SSL TLS,在谷歌上找到的很实用的文档,特意转来分享。
NULL 博文链接:https://shuaizhuaidym.iteye.com/blog/2284877
java实现 SSL双向认证,java ssl包使用
介绍了如何使用Java程序实现SSL加密,以及使用Openssl生成密码
Java Socket 实现SMTP邮件发送,支持SSL/TSL
java实现SSL的双向认证.模拟场景: Server端和Client端通信,需要进行授权和身份的验证,即Client只能接受Server的消息,Server只能接受Client的消息。
JAVA通过LDAP+SSL(证书)实现用户和组织(部门)增删改查(Java代码部分),里面包含源码和文档,以便大家测试。
使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书
java实现_SSL双向认证,里面详细介绍怎样实现,还包括完整的实现代码,直接可用
ssl java实现
java实现的ssl登陆,与开放平台原理相似,提供出来供大家学习参考
压缩包里有客户端源码和服务器端源码,支持TCP的双向认证,也支持WEBSOCKET的双向认证,内附测试 wss的测试例子, 需要生成PKCS12的证书,导入浏览器才可以测试。
简单实现用java socket实现smtp邮件发送,支持SSL/TSL协议;
java实现ssl自签名。 由于生成的证书是jks格式,nginx不能直接用,需要要转成PEM格式,这要用到jks2pfx工具进行转换。 jks2pfx的命令格式:JKS2PFX.bat keystore password alias exportname keystore:KeyStore文件...
专题之Java中SSL实现.pdf
Java中SSL实现[整理].pdf
要实现SSL双向认证, 你必须同时配置Web服务器证书和客户端证书, 并且需要在服务器和客户端之间正确安装根证书。如此方可实现如文所示双向认证。