日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSL的TCP通信

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSL的TCP通信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一切盡在代碼中,額,自己測試的小例子,感覺很有用,做個記錄。

服務(wù)器端:

</pre><pre name="code" class="java">package com.mpc.test.clazz;import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.security.KeyStore; import java.security.SecureRandom;import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.TrustManagerFactory;public class SSLTest {public static void main(String[] args) throws Exception {String key = "d:/keys/m.jks";// 定義服務(wù)器端要使用的證書String trust = "d:keys/trustclient.jks";// 定義服務(wù)器端要信任的證書/* 個人感覺,上面這兩個屬性在使用的時候完全可以定義為properties文件或者xml文件來使用 */KeyStore keyStore = KeyStore.getInstance("JKS");// 定義一個KeyStore用來存儲服務(wù)器的秘鑰文件keyStore.load(new FileInputStream(key), "123456".toCharArray());// 加載服務(wù)器端使用的證書,當(dāng)然要輸入要打開加密文件的密碼了KeyStore trustStore = KeyStore.getInstance("JKS");// 定義一個KeyStore用來存儲服務(wù)器信任的證書文件trustStore.load(new FileInputStream(trust), "123456".toCharArray());// 加載服務(wù)器端信任的證書文件,當(dāng)然也要輸入密碼的/** 額,其實keyStore和truststore都是Keystore的大家都看到了,就是保存的秘鑰文件不同而已了 */KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());/** 創(chuàng)建一個服務(wù)器的秘鑰管理工廠,KeyManagerFactory.* getDefaultAlgorithm* ()是指定的默認(rèn)的算法,記得是RSA··輸出一下就OK了*/kmf.init(keyStore, "mipengcheng".toCharArray());/** 初始化,在初始化的時候需要自定秘鑰的密碼,* 這個在創(chuàng)建的時候指定的*/TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());/** 創(chuàng)建一個服務(wù)器信任證書的管理工廠* ,* 同樣指定了RSA的算法*/tmf.init(trustStore);/* 初始化,由于信任的是證書,不是秘鑰,所以不用指定密碼什么的了 */SSLContext sslc = SSLContext.getInstance("TLSv1");/** 獲得TLSv1版本的SSLContext,* 還有個ssl3的*/sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(),new SecureRandom());/* 用兩個工廠來初始化SSLContext */SSLServerSocketFactory sllFactory = sslc.getServerSocketFactory();/* 獲得服務(wù)器端口工廠 */SSLServerSocket serverSocket = (SSLServerSocket) sllFactory.createServerSocket(9999);/* 創(chuàng)建serverSocket,在9999端口監(jiān)聽 *//* 這句很重要,是要開啟客戶端的安全證書驗證滴 */serverSocket.setNeedClientAuth(true);System.out.println("服務(wù)器已經(jīng)啟動了........");while (true) {final Socket socket = serverSocket.accept();/** accept用來阻塞監(jiān)聽線程,訪問一個處理一個*/System.out.println("接收到" + socket.getRemoteSocketAddress() + "的請求");new Thread(new MyThread(socket)).start();/* 創(chuàng)建新的線程用來處理接受到的socket */}}static class MyThread implements Runnable {private Socket socket;public MyThread(Socket socket) {super();this.socket = socket;}public void run() {/** 這里是對接受的請求的處理,沒什么東西了。 */try {System.out.println("服務(wù)器開始讀取數(shù)據(jù)=====");BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(),true);String message;while (null != (message = read.readLine())) {if (message.equals("end")) {out.println("agree");break;} else {System.out.println("結(jié)果" + message);out.println("服務(wù)器收到消息");}}System.out.println("服務(wù)器跳出循環(huán)");Thread.sleep(10000);out.close();read.close();} catch (Exception e) {e.printStackTrace();}}} }

客戶端:

package com.mpc.test.clazz;import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.security.KeyStore; import java.security.SecureRandom;import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory;public class SSLTestClient {public static void main(String[] args) throws Exception {/* 從這里開始======== */String key = "d:/keys/trustm.jks";String client = "d:/keys/client.jks";KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(new FileInputStream(key), "123456".toCharArray());KeyStore clientStore = KeyStore.getInstance(KeyStore.getDefaultType());clientStore.load(new FileInputStream(client), "123456".toCharArray());TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keyStore);KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(clientStore, "123456".toCharArray());SSLContext sslc = SSLContext.getInstance("TLSv1");sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(),new SecureRandom());/* 到這里結(jié)束======== *//** 上面注釋包圍的內(nèi)容,和服務(wù)器端的一樣,只是這里變成了客戶端要使用的秘鑰,客戶端要信任的證書 */SSLSocketFactory sslSocketFactory = sslc.getSocketFactory();/* 獲得socketFactory */SSLSocket socket = (SSLSocket) sslSocketFactory.createSocket("127.0.0.1", 9999);/* 訪問本機(jī)的9999端口 */socket.setKeepAlive(true);/*長連接···*//*下面都是消息的處理,沒什么東西了*/BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream(), true);out.println("cilent message");String message;int i = 0;while (null != (message = read.readLine())) {System.out.println(message);i++;if (message.equals("agree")) {break;} else {}Thread.sleep(1000);out.println("cilent message");if (i == 5) {out.println("end");}}socket.close();out.close();read.close();System.out.println("客戶端跳出了while循環(huán)");} }


測試結(jié)果:

1.服務(wù)器端:


2.客戶端:


在項目中使用到的證書


關(guān)于證書的創(chuàng)建,這里以服務(wù)器端的秘鑰的創(chuàng)建和服務(wù)器要給客戶端使用的信任證書的創(chuàng)建為例:

使用jdk自帶的keytool來創(chuàng)建。

D:\keys>keytool -genkeypair -alias mkey -keyalg RSA -validity 7 -keystore m.jks 輸入密鑰庫口令: 再次輸入新口令: 您的名字與姓氏是什么?[Unknown]: mi 您的組織單位名稱是什么?[Unknown]: my 您的組織名稱是什么?[Unknown]: isis 您所在的城市或區(qū)域名稱是什么?[Unknown]: city 您所在的省/市/自治區(qū)名稱是什么?[Unknown]: state 該單位的雙字母國家/地區(qū)代碼是什么?[Unknown]: china CN=mi, OU=my, O=isis, L=city, ST=state, C=china是否正確?[否]: y輸入 <mkey> 的密鑰口令(如果和密鑰庫口令相同, 按回車): 再次輸入新口令:
使用第一行的命令來生成證書,指定名字為m.jks;然后根據(jù)提示就可以創(chuàng)建服務(wù)器端的秘鑰了。


D:\keys>keytool -export -alias mkey -keystore m.jks -rfc -file rootca.cer 輸入密鑰庫口令: 存儲在文件 <rootca.cer> 中的證書


這條命令導(dǎo)出了服務(wù)器端的證書文件,用來供其他客戶端驗證服務(wù)器。但是java貌似不用這個,所以在把它導(dǎo)成jks的。


D:\keys>keytool -import -alias mcer -file rootca.cer -keystore trustm.jks 輸入密鑰庫口令: 再次輸入新口令: 所有者: CN=mi, OU=my, O=isis, L=city, ST=state, C=china 發(fā)布者: CN=mi, OU=my, O=isis, L=city, ST=state, C=china 序列號: 2ed10bf7 有效期開始日期: Wed Jan 27 16:24:15 CST 2016, 截止日期: Wed Feb 03 16:24:15 CST 2016 證書指紋:MD5: 44:3A:CB:4D:B3:BE:FF:63:67:61:0C:19:97:DA:02:09SHA1: 5E:D2:48:8F:37:29:00:94:99:AB:A1:93:B0:1F:2E:65:74:39:06:50SHA256: 98:B3:62:6F:3A:77:F5:9E:BA:29:A8:55:16:E7:47:92:79:ED:45:26:E9: 7F:A8:ED:88:82:89:AA:FD:4C:3A:35簽名算法名稱: SHA256withRSA版本: 3擴(kuò)展:#1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: B0 51 15 9A E5 2F 8A 29 D2 4E 15 AE 0B 86 83 13 .Q.../.).N...... 0010: EE BC 7B E2 .... ] ]是否信任此證書? [否]: y 證書已添加到密鑰庫中
這條命令就把服務(wù)器端給客戶端驗證的證書的jks文件生成了。


客戶端的相關(guān)秘鑰,證書的生成也是一樣的。


本人才疏學(xué)淺,只是想折騰折騰,學(xué)習(xí)學(xué)習(xí),如果有什么不對的,不足的地方,還請大家包涵,指教!


創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的SSL的TCP通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。