基于TLS协议的安全分析
1,基于TLS的Socket通信實現(xiàn)
1.1安裝openssl
1.1.1下載地址:
http://slproweb.com/products/Win32OpenSSL.html。
1.1.2配置環(huán)境
控制面板->系統(tǒng)和安全->系統(tǒng)->高級系統(tǒng)設置->環(huán)境變量
1.1.3使用計算機終端切換保存路徑
1.2生成CA證書
1.2.1創(chuàng)建CA私鑰:genrsa -out ca-key.pem 2048
該命令含義如下:
genrsa——使用RSA算法產(chǎn)生私鑰
-out——輸出文件的路徑
2048——指定私鑰長度
1.2.2創(chuàng)建CA證書請求:req -new -out ca-req.csr -key ca-key.pem
該命令含義如下:
req——執(zhí)行證書簽發(fā)命令
-new——新證書簽發(fā)請求
-out——輸出的csr文件的路徑
-key——指定私鑰路徑
1.2.3創(chuàng)建CA自簽證書:x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 365
該命令的含義如下:
x509——生成x509格式證書
-req——輸入csr文件
-in——輸入的csr文件的路徑
-out——輸出的cer證書文件的路徑
-signkey——簽發(fā)證書的私鑰
1.2.4生成結(jié)果目錄如下:
1.3生成Server證書
1.3.1創(chuàng)建Server私鑰:genrsa -out server-key.pem 2048
1.3.2創(chuàng)建Server證書請求:req -new -out server-req.csr -key server-key.pem
1.3.3創(chuàng)建自簽Server證書:x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 365
該命令含義如下:
-CA——指定CA證書的路徑
-CAkey——指定CA證書的私鑰路徑
-CAserial——指定證書序列號文件的路徑
-CAcreateserial——表示創(chuàng)建證書序列號文件(即上方提到的serial文件),創(chuàng)建的序列號文件默認名稱為-CA,指定的證書名稱后加上.srl后綴
1.3.4生成結(jié)果目錄如下:
1.4python中安裝openssl庫
安裝語句:pip install pyopenssl,import ssl無報錯即安裝成功。
2,實現(xiàn)代碼
2.1服務器端實現(xiàn)代碼
import socket
import sslclass server_ssl:def build_listen(self):# 生成SSL上下文context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)# 加載服務器所用證書和私鑰context.load_cert_chain('E:\\pycharm\\ssl\\FILE\\server-cert.pem', 'E:\\pycharm\\ssl\\FILE\\server-key.pem')# 監(jiān)聽端口with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:sock.bind(('127.0.0.1', 7777))sock.listen(5)# 將socket打包成SSL socketwith context.wrap_socket(sock, server_side=True) as ssock:while True:# 接收客戶端連接client_socket, addr = ssock.accept()msg = client_socket.recv(1024).decode("utf-8")print(f"receive msg from client {addr}:{msg}")# 向客戶端發(fā)送信息msg = f"yes , you have client_socketect with server.\r\n".encode("utf-8")client_socket.send(msg)client_socket.close()
if __name__ == "__main__":server = server_ssl()server.build_listen()在這里插入代碼片
2.2客戶端實現(xiàn)代碼
import socket
import sslclass client_ssl:def send_hello(self,):# 生成SSL上下文context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)# 加載信任根證書context.load_verify_locations('E:\\pycharm\\ssl\\FILE\\ca-cert.pem')#與服務端建立socket連接with socket.create_connection(('127.0.0.1',7777)) as sock:# 將socket打包成SSL socket# 注意的是這里的server_hostname不是指服務端IP,而是指服務端證書中設置的CNwith context.wrap_socket(sock, server_hostname='test') as ssock:msg = "do i connect with server ?".encode("utf-8")ssock.send(msg)# 接收服務端返回的信息msg = ssock.recv(1024).decode("utf-8")print(f"receive msg from server : {msg}")ssock.close()if __name__ == "__main__":client = client_ssl()client.send_hello()
2.3運行結(jié)果
3,抓包分析
3.1Client Hello:
TLS記錄協(xié)議首部:
內(nèi)容類型(Content Type:Handshake):TLS握手協(xié)議,占一字節(jié),0x16
TLS版本(Version):TLS1.0,占兩字節(jié),0x0301
數(shù)據(jù)長度(Length):512字節(jié),占兩字節(jié),0x0200
TLS握手內(nèi)容:
握手類型(Handshake Type):客戶Hello,占一字節(jié),0x01;
握手消息長度(Length):508字節(jié),占三字節(jié),0x0001fc;
TLS協(xié)議版本(Version):TLS1.2,占兩字節(jié),0x0303;
客戶生成的隨機數(shù)(Random):占32字節(jié),0x9bd8d15c9094b4823d8ef1f7347f7414281b9e8c9be796293fcb9e14a62223,其中前四字節(jié)是中國標準時間,0x9bd8d15c;
會話id長度(Session ID Length):0,占一字節(jié),0x00;
密碼套件長度(Cipher suites length):130字節(jié),占兩字節(jié),0x0082;
密碼套件(65種套件)(Cipher Suites(65 suites)):占130字節(jié),其中每一種套件占兩字節(jié),密碼套件由四部分組成(基于的協(xié)議-密鑰協(xié)商交換算法-加密算法和加密模式-MAC算法);
壓縮算法長度(Compression Methods Length):1字節(jié),占一字節(jié),0x01;
壓縮算法(Compression Method):無,占一字節(jié),0x00;
擴展長度(Extensions Length):337字節(jié),占兩字節(jié),0x0151;
擴展:服務器名稱
類型:服務器名稱,占兩字節(jié),0x0000;
擴展長度:9字節(jié),占兩字節(jié),0x0009;
服務器名稱指示擴展:
服務器名稱列表長度(Server Name list length):7字節(jié),占兩字節(jié),0x0007;
服務器名稱類型(Server Name Type):主機名,占1字節(jié),0x00;
服務器名稱長度(Server Name length):4字節(jié),占2字節(jié),0x0004
服務器名稱(Server Name):test,占4字節(jié),0x74657374
擴展:橢圓曲線點格式
類型(Type):橢圓曲線點格式,占2字節(jié),0x000b;
擴展長度:4字節(jié),占2字節(jié),0x0004;
橢圓曲線點格式長度:3字節(jié),占1字節(jié),0x03;
橢圓曲線點格式:每個占1字節(jié);
支持的橢圓曲線類型:有13種類型,每種類型占兩個字節(jié);
支持的簽名算法:有15種類型,每種算法占兩個字節(jié);
3.2服務器Hello
TLS記錄協(xié)議首部
內(nèi)容類型(Content Type:Handshake):TLS握手協(xié)議,占一字節(jié),0x16
TLS版本(Version):TLS1.2,占兩字節(jié),0x0303
數(shù)據(jù)長度(Length):66字節(jié),占兩字節(jié),0x0042
TLS握手內(nèi)容:
握手類型(Handshake Type):服務器 Hello,占一字節(jié),0x02;
握手消息長度(Length):62字節(jié),占三字節(jié),0x00003e;
TLS協(xié)議版本(Version):TLS1.2,占兩字節(jié),0x0303;
客戶生成的隨機數(shù)(Random):占32字節(jié),0x6405d04ce1b2de387353475a46cfbd5a6d901d4efc262690ba663afed8c70b86,其中前四字節(jié)是中國標準時間,0x6405d04c;
會話id長度(Session ID Length):0,占一字節(jié),0x00;
選擇的加密套件(Cipher Suite):TLS_ECDHE_RSA_AES_256_GCM_SHA384,占兩字節(jié),0xc030
3.3服務器發(fā)送自己的證書
握手類型:證書,占兩字節(jié),0x0b;
握手消息長度:854字節(jié),占三字節(jié),0x000356;
證書長度:851字節(jié),占三字節(jié),0x000353;
證書的內(nèi)容如下:
證書內(nèi)容的長度:848字節(jié),占三字節(jié),0x000350;
序列號:15977231136593676939,占9字節(jié),0x00ddba871156fa0a8b;
使用的簽名算法:sha256withRSAEncryption;
算法標識:1.2.840.113549.1.1.11,占9字節(jié),0x2a864886f70d01010b;
國家名稱:CN,占2字節(jié),0x4341;
州或省名稱:SC,占2字節(jié),0x5343;
地區(qū)名稱:CD,占2字節(jié),0x4344;
組織名稱:no,占2字節(jié),0x6e6f;
組織單位名稱:test,占4字節(jié),0x74657374;
郵箱地址:test,占4字節(jié),0x74657374;
填充長度:0字節(jié),占1字節(jié),0x00;
有效起始時間:2019/12/19 10;58:29,占13字節(jié),0x3139313231393130353832395a;
有效截至時間:2020/12/18 10:58:29,占13字節(jié),0x3230313231383130353832395a;
模數(shù)(n):
公開指數(shù)(e):65537,占兩字節(jié),0x010001;
加密后的數(shù)據(jù):占256字節(jié);
3.4服務器發(fā)送密鑰交換
服務器選擇的橢圓曲線類型:secp256r1,占兩字節(jié),0x0017;
公鑰長度:65字節(jié),占一字節(jié),0x65;
哈希算法:SHA512,占1字節(jié),0x06;
簽名算法:RSA,占1字節(jié),0x01;
簽名長度:256字節(jié),占1字節(jié),0x0100;
簽名內(nèi)容:
3.5服務器hello完畢
握手類型:服務器hello完畢,占一字節(jié),0x0e;
3.6用戶密鑰交換
握手類型:用戶密鑰交換,占1字節(jié),0x10;
握手內(nèi)容長度:66字節(jié),占3字節(jié),0x000042;
客戶公鑰長度:65字節(jié),占1字節(jié),0x41;
客戶公鑰長度:
3.7客戶端發(fā)送更改密碼規(guī)范
內(nèi)容類型(Content Type:Handshake):改變密碼規(guī)范協(xié)議,占1字節(jié),0x14;
數(shù)據(jù)長度(Length):1字節(jié),占兩字節(jié),0x0101;
數(shù)據(jù)內(nèi)容:0x01;
3.8客戶端發(fā)送加密的握手消息
消息長度:40字節(jié),占兩字節(jié),0x0028;
3.9服務器發(fā)送新的會話票據(jù)
握手類型:新的會話票據(jù),占1字節(jié),0x04;
握手數(shù)據(jù)長度:186字節(jié),占3字節(jié),0x0000b6;
會話票據(jù)的生存時間:300秒,占4字節(jié),0x0000012c;
會話票據(jù)長度:176字節(jié),占2字節(jié),0x00b0;
會話票據(jù)內(nèi)容:
3.10服務器發(fā)改變密碼規(guī)則
(跟客戶發(fā)送的一樣這里不再作出解釋)
3.11服務器發(fā)送加密的握手消息
消息長度:40字節(jié),占兩字節(jié),0x0028;
4.參考文獻
1,https://blog.csdn.net/g1531997389/article/details/80048313;
2,https://blog.csdn.net/s030602122/article/details/53538383;
3,https://blog.csdn.net/ld11690/article/details/79205566;
4,https://baike.baidu.com/item/TLS/2979545?fr=aladdin;
5,<<網(wǎng)絡安全>>沈鑫剡等編著,清華大學出版社
總結(jié)
以上是生活随笔為你收集整理的基于TLS协议的安全分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java java se_Java SE
- 下一篇: 更新后谷歌浏览器皮肤背景自动变成黑色模式