06-HTTPS单向认证及Java案例
创始人
2024-01-28 17:00:32
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?# 《安全》

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...