https——TCP+TLS
- 主題:基于mbedtls-2.16.0,驗證TLS會話復用功能
- 驗證環境:
- 1.TLS服務端
- 2.TLS客戶端
- 2.1 基于Sesssion ID
- 2.1.1mbedtls-2.16.0庫的宏配置
- 2.1.2 初始化配置
- 2.1.3 TCP連接
- 2.1.4 首次TLS連接
- 2.1.4.1 發送加密算法列表
- 2.1.4.2 選擇加密算法(用于會話秘鑰)
- 2.1.4.3 發送預主秘鑰(用于生成會話秘鑰)
- 2.1.4.4 客戶端發送 Change Cipher Spec 消息(通知服務端準備使用新秘鑰進行通信)
- 2.1.4.5 客戶端確認密鑰協商正確
- 2.1.4.6 服務端發送 Change Cipher Spec 消息(通知客戶端準備使用新秘鑰進行通信)
- 2.1.4.7 服務端密鑰協商的正確性
- 2.1.4.6 終止加密通信(客戶端主動停止TLS通信——方便驗證后續TLS會話復用)
- 2.1.5 保存TLS連接會話
- 2.1.6 銷毀連接
- 2.1.7 重新建立TCP連接
- 2.1.8 復用會話
- 2.1.9 TLS重新連接
- 2.2 基于Ticket
- 2.2.1開啟mbedtls庫的TLS Ticket復用功能
- 2.2.2 初始化配置
- 2.2.3 配置Ticket
- 2.2.4 TCP連接
- 2.2.5 首次TLS連接
- 2.2.6 保存TLS連接會話
- 2.2.7 銷毀連接
- 2.2.8 重新建立TCP連接
- 2.2.9 復用會話
- 2.2.10 TLS重新連接
主題:基于mbedtls-2.16.0,驗證TLS會話復用功能
驗證環境:
設備與PC驗證TLS會話復用
1.TLS服務端
python代碼
# -*- coding: utf-8 -*-
import socket
import ssl
import timehost = '192.168.x.xx' # 服務器IP地址
port = 443 # 服務器端口# 加載證書和私鑰
certfile = "certificate.pem"
keyfile = "private.key"def create_server():context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)context.load_cert_chain(certfile, keyfile=keyfile)#context.verify_mode = ssl.CERT_NONE# 啟用SSL會話緩存#context.session_cache_mode = ssl.SESSION_CACHE_SERVER#context.session_cache_size = 100 # 可以設置緩存的大小,調整為合適的值server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind((host, port))server_socket.listen(5)print("TLS server started on {}:{}".format(host, port))while True:# 等待客戶端連接client_socket, client_addr = server_socket.accept()print("Connection from {}".format(client_addr)) # 使用str.format()格式化# 包裝客戶端連接以啟用TLSssl_socket = context.wrap_socket(client_socket, server_side=True)try:data = ssl_socket.recv(1024) # 接收數據(測試連接時間)if data:print("Received data: {}".format(data))ssl_socket.send(b'Hello from server')except Exception as e:print("Connection error: {}".format(e))finally:ssl_socket.close()if __name__ == "__main__":create_server()
啟動TLS服務
sudo python3 tls_server.py
TLS server started on 192.168.xx.xxx:443
Connection from ('192.168.xx.xxx', 56626)
......
2.TLS客戶端
2.1 基于Sesssion ID
2.1.1mbedtls-2.16.0庫的宏配置
#define MBEDTLS_SSL_CACHE_C
2.1.2 初始化配置
// 初始化所有組件mbedtls_net_init(&server_fd);mbedtls_ssl_init(&ssl);mbedtls_ssl_config_init(&conf);mbedtls_entropy_init(&entropy);mbedtls_ctr_drbg_init(&ctr_drbg);mbedtls_ssl_session_init(&saved_session);// 配置隨機數生成器mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,(const unsigned char *)"tls_client", 10))// 配置SSL參數mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,MBEDTLS_SSL_TRANSPORT_STREAM,MBEDTLS_SSL_PRESET_DEFAULT)// 配置無CA驗簽mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE);// 生成隨機數mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);mbedtls_ssl_conf_dbg(&conf, NULL, 0);
2.1.3 TCP連接
// TCP連接mbedtls_net_connect(&server_fd, SERVER, PORT,
MBEDTLS_NET_PROTO_TCP) // 配置上下文mbedtls_ssl_setup(&ssl, &conf);// 綁定端口mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
2.1.4 首次TLS連接
2.1.4.1 發送加密算法列表
// TLS握手mbedtls_ssl_handshake(ssl);
Seesion ID為0.
2.1.4.2 選擇加密算法(用于會話秘鑰)
2.1.4.3 發送預主秘鑰(用于生成會話秘鑰)
2.1.4.4 客戶端發送 Change Cipher Spec 消息(通知服務端準備使用新秘鑰進行通信)
2.1.4.5 客戶端確認密鑰協商正確
2.1.4.6 服務端發送 Change Cipher Spec 消息(通知客戶端準備使用新秘鑰進行通信)
2.1.4.7 服務端密鑰協商的正確性
2.1.4.6 終止加密通信(客戶端主動停止TLS通信——方便驗證后續TLS會話復用)
2.1.5 保存TLS連接會話
// 保存會話
mbedtls_ssl_get_session(&ssl, &saved_session)
2.1.6 銷毀連接
//斷開TLS連接
mbedtls_ssl_close_notify(&ssl);
mbedtls_ssl_free(&ssl);//斷開TCP連接
mbedtls_net_free(&server_fd);
2.1.7 重新建立TCP連接
// TCP連接mbedtls_net_connect(&server_fd, SERVER, PORT,
MBEDTLS_NET_PROTO_TCP) // 初始化SSL結構體
mbedtls_ssl_init(&ssl);// 配置上下文mbedtls_ssl_setup(&ssl, &conf);// 綁定端口mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
2.1.8 復用會話
// 更新舊會話到當前ssl
mbedtls_ssl_set_session(&ssl, &saved_session);
2.1.9 TLS重新連接
// TLS握手mbedtls_ssl_handshake(ssl);
2.2 基于Ticket
2.2.1開啟mbedtls庫的TLS Ticket復用功能
#define MBEDTLS_SSL_SESSION_TICKETS
2.2.2 初始化配置
// 初始化所有組件mbedtls_net_init(&server_fd);mbedtls_ssl_init(&ssl);mbedtls_ssl_config_init(&conf);mbedtls_entropy_init(&entropy);mbedtls_ctr_drbg_init(&ctr_drbg);mbedtls_ssl_session_init(&saved_session);// 配置隨機數生成器mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,(const unsigned char *)"tls_client", 10))// 配置SSL參數mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT,MBEDTLS_SSL_TRANSPORT_STREAM,MBEDTLS_SSL_PRESET_DEFAULT)// 配置無CA驗簽mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_NONE);// 生成隨機數mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
2.2.3 配置Ticket
//配置Ticket使能mbedtls_ssl_conf_session_tickets(&conf, MBEDTLS_SSL_SESSION_TICKETS_ENABLED);mbedtls_ssl_conf_dbg(&conf, NULL, 0);
2.2.4 TCP連接
// TCP連接mbedtls_net_connect(&server_fd, SERVER, PORT,
MBEDTLS_NET_PROTO_TCP) // 配置上下文mbedtls_ssl_setup(&ssl, &conf);// 綁定端口mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
2.2.5 首次TLS連接
// TLS握手mbedtls_ssl_handshake(ssl);
2.2.6 保存TLS連接會話
// 保存會話
mbedtls_ssl_get_session(&ssl, &saved_session)
2.2.7 銷毀連接
//斷開TLS連接
mbedtls_ssl_close_notify(&ssl);
mbedtls_ssl_free(&ssl);//斷開TCP連接
mbedtls_net_free(&server_fd);
2.2.8 重新建立TCP連接
// TCP連接mbedtls_net_connect(&server_fd, SERVER, PORT,
MBEDTLS_NET_PROTO_TCP) // 初始化SSL結構體
mbedtls_ssl_init(&ssl);// 配置上下文mbedtls_ssl_setup(&ssl, &conf);// 綁定端口mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL);
2.2.9 復用會話
// 更新舊會話到當前ssl
mbedtls_ssl_set_session(&ssl, &saved_session);
2.2.10 TLS重新連接
// TLS握手mbedtls_ssl_handshake(ssl);