06-HTTPS单向认证及Java案例
创始人
2024-04-09 07:29:16
0

一、单向认证流程

单向认证流程中,服务器端保存着公钥证书和私钥两个文件,整个握手过程如下:

  1. 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务器端;
  2. 服务器端将本机的公钥证书(server.crt)发送给客户端;
  3. 客户端读取公钥证书(server.crt),取出了服务端公钥;
  4. 客户端生成一个随机数(密钥R),用刚才得到的服务器公钥去加密这个随机数形成密文,发送给服务端;
  5. 服务端用自己的私钥(server.key)去解密这个密文,得到了密钥R
  6. 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。

二、Java代码

选择使用单向认证,这种情况下client侧不需要提供证书。所以,
server侧只需要自己的keystore文件,不需要truststore文件
client侧不需要自己的keystore文件,只需要truststore文件(其中包含server的公钥)。
此外server侧需要在创建SSLServerSocket之后设定不需要客户端证书:setNeedClientAuth(false)

其中生成证书的命令可以查看
02-HTTPS证书生成、验签 、证书链

server代码

public class CatServerNoClientAuth implements Runnable, HandshakeCompletedListener {public static final int SERVER_PORT = 11123;private final Socket _s;public CatServerNoClientAuth(Socket s) {_s = s;}public static void main(String[] args) throws Exception {String serverKeyStoreFile = "D:\\code\\mycode\\java-study\\https\\src\\main\\resources\\server.p12";String serverKeyStorePwd = "huawei";String catServerKeyPwd = "huawei";KeyStore serverKeyStore = KeyStore.getInstance("JKS");serverKeyStore.load(new FileInputStream(serverKeyStoreFile), serverKeyStorePwd.toCharArray());KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(serverKeyStore, catServerKeyPwd.toCharArray());SSLContext sslContext = SSLContext.getInstance("TLSv1");sslContext.init(kmf.getKeyManagers(), null, null);SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(SERVER_PORT);sslServerSocket.setNeedClientAuth(false);while (true) {SSLSocket s = (SSLSocket) sslServerSocket.accept();CatServerNoClientAuth cs = new CatServerNoClientAuth(s);s.addHandshakeCompletedListener(cs);new Thread(cs).start();}}@Overridepublic void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(_s.getInputStream()));PrintWriter writer = new PrintWriter(_s.getOutputStream(), true);writer.println("Welcome~, enter exit to leave.");String s;while ((s = reader.readLine()) != null && !s.trim().equalsIgnoreCase("exit")) {writer.println("Echo: " + s);}writer.println("Bye~");} catch (Exception e) {e.printStackTrace();} finally {try {_s.close();} catch (IOException e) {e.printStackTrace();}}}@Overridepublic void handshakeCompleted(HandshakeCompletedEvent event) {try {X509Certificate cert = (X509Certificate) event.getPeerCertificates()[0];} catch (SSLPeerUnverifiedException ex) {System.out.println("handshakeCompleted, SSLPeerUnverified.");}}
}

client代码

public class FoxClientNoClientAuth {public static void main(String[] args) throws Exception {String clientTrustKeyStoreFile = "D:\\code\\mycode\\java-study\\https\\src\\main\\resources\\root.p12";String clientTrustKeyStorePwd = "huawei";KeyStore clientTrustKeyStore = KeyStore.getInstance("JKS");clientTrustKeyStore.load(new FileInputStream(clientTrustKeyStoreFile), clientTrustKeyStorePwd.toCharArray());TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(clientTrustKeyStore);SSLContext sslContext = SSLContext.getInstance("TLSv1");sslContext.init(null, tmf.getTrustManagers(), null);SSLSocketFactory socketFactory = sslContext.getSocketFactory();Socket socket = socketFactory.createSocket("localhost", 11123);PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));send("hello", out);send("exit", out);receive(in);socket.close();}public static void send(String s, PrintWriter out) throws IOException {System.out.println("Sending: " + s);out.println(s);}public static void receive(BufferedReader in) throws IOException {String s;while ((s = in.readLine()) != null) {System.out.println("Reveived: " + s);}}
}

参考文章:

更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》> 更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》> 更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》> 更多内容关注微信公众号 ”前后端技术精选“,或者语雀,里面有更多知识:https://www.yuque.com/riverzmm/uu60c9?# 《安全》

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...