https——TCP+TLS

发布于:2025-07-17 ⋅ 阅读:(15) ⋅ 点赞:(0)

主题:基于mbedtls-2.16.0,验证TLS会话复用功能

验证环境:

设备与PC验证TLS会话复用
在这里插入图片描述

1.TLS服务端

python代码

# -*- coding: utf-8 -*-
import socket
import ssl
import time

host = '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()格式化

        # 包装客户端连接以启用TLS
        ssl_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);

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到