https——TCP+TLS

https------TCP+TLS

  • 主题:基于mbedtls-2.16.0,验证TLS会话复用功能
  • 验证环境:
  • 1.TLS服务端
  • 2.TLS客户端
    • [2.1 基于Sesssion ID](#2.1 基于Sesssion ID)
      • 2.1.1mbedtls-2.16.0库的宏配置
      • [2.1.2 初始化配置](#2.1.2 初始化配置)
      • [2.1.3 TCP连接](#2.1.3 TCP连接)
      • [2.1.4 首次TLS连接](#2.1.4 首次TLS连接)
        • [2.1.4.1 发送加密算法列表](#2.1.4.1 发送加密算法列表)
        • [2.1.4.2 选择加密算法(用于会话秘钥)](#2.1.4.2 选择加密算法(用于会话秘钥))
        • [2.1.4.3 发送预主秘钥(用于生成会话秘钥)](#2.1.4.3 发送预主秘钥(用于生成会话秘钥))
        • [2.1.4.4 客户端发送 Change Cipher Spec 消息(通知服务端准备使用新秘钥进行通信)](#2.1.4.4 客户端发送 Change Cipher Spec 消息(通知服务端准备使用新秘钥进行通信))
        • [2.1.4.5 客户端确认密钥协商正确](#2.1.4.5 客户端确认密钥协商正确)
        • [2.1.4.6 服务端发送 Change Cipher Spec 消息(通知客户端准备使用新秘钥进行通信)](#2.1.4.6 服务端发送 Change Cipher Spec 消息(通知客户端准备使用新秘钥进行通信))
        • [2.1.4.7 服务端密钥协商的正确性](#2.1.4.7 服务端密钥协商的正确性)
        • [2.1.4.6 终止加密通信(客户端主动停止TLS通信------方便验证后续TLS会话复用)](#2.1.4.6 终止加密通信(客户端主动停止TLS通信——方便验证后续TLS会话复用))
      • [2.1.5 保存TLS连接会话](#2.1.5 保存TLS连接会话)
      • [2.1.6 销毁连接](#2.1.6 销毁连接)
      • [2.1.7 重新建立TCP连接](#2.1.7 重新建立TCP连接)
      • [2.1.8 复用会话](#2.1.8 复用会话)
      • [2.1.9 TLS重新连接](#2.1.9 TLS重新连接)
    • [2.2 基于Ticket](#2.2 基于Ticket)
      • [2.2.1开启mbedtls库的TLS Ticket复用功能](#2.2.1开启mbedtls库的TLS Ticket复用功能)
      • [2.2.2 初始化配置](#2.2.2 初始化配置)
      • [2.2.3 配置Ticket](#2.2.3 配置Ticket)
      • [2.2.4 TCP连接](#2.2.4 TCP连接)
      • [2.2.5 首次TLS连接](#2.2.5 首次TLS连接)
      • [2.2.6 保存TLS连接会话](#2.2.6 保存TLS连接会话)
      • [2.2.7 销毁连接](#2.2.7 销毁连接)
      • [2.2.8 重新建立TCP连接](#2.2.8 重新建立TCP连接)
      • [2.2.9 复用会话](#2.2.9 复用会话)
      • [2.2.10 TLS重新连接](#2.2.10 TLS重新连接)

主题:基于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);


相关推荐
null_null9991 天前
宝塔nginx http转https代理
nginx·http·https
南♡黎(・ิϖ・ิ)っ1 天前
JavaEE初阶,网络原理HTTP报头篇
网络·https·java-ee
爱编程的鱼1 天前
HTTP 是什么?它是如何工作的
网络·网络协议·http
刘一说1 天前
CentOS Stream 网络故障排查:静态IP丢失、无法访问的完整解决方案
linux·tcp/ip·centos
ZhengEnCi1 天前
N2H-为什么99%的人不会做子网划分?大厂网络工程师的VLSM子网划分实战解析
网络协议
QT 小鲜肉1 天前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
ozawacai2 天前
详细了解TLS、HTTPS、SSL原理
计算机网络·https·ssl
2501_915918412 天前
HTTP抓包工具推荐,Fiddler使用教程、代理设置与调试技巧详解(含HTTPS配置与实战案例)
http·ios·小程序·https·fiddler·uni-app·webview
张人玉2 天前
C# TCP 服务器和客户端
服务器·tcp/ip·c#
雯0609~2 天前
宝塔配置:IP文件配置,根据端口配置多个项目文件(不配置域名的情况)
服务器·网络协议·tcp/ip