当前位置: 首页 > news >正文

https——TCP+TLS

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);

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

http://www.dtcms.com/a/273421.html

相关文章:

  • ChatGPT无法登陆?分步排查指南与解决方案
  • S7-1200 与 S7-300 CPS7-400 CP UDP 通信 Step7 项目编程
  • MS1826+MS9332 4K@30Hz HD4×2视频分割器
  • .net服务器Kestrel配置Nginx作为反向代理
  • 如何准确查看服务器网络的利用率?
  • 如何查看自己本地的公网IP地址?内网环境网络如何开通服务器公网ip提供互联网访问?
  • UDP服务器的优缺点都包含哪些?
  • Spring Boot主从服务器详解教程
  • 性能狂飙 Gooxi 8卡5090服务器重新定义高密度算力
  • 中国银联豪掷1亿采购海光C86架构服务器
  • 没有管理员权限,在服务器安装使用 Jupyter + R 内核
  • JVM 内存结构
  • QTextCodec的功能及其在Qt5及Qt6中的演变
  • RLHF(人类反馈的强化学习)
  • Java JDK 下载指南
  • ThinkBook 14s IWL(20RM)OEM系统镜像原厂Win10系统
  • Zero-Shot(零样本学习),One-Shot(单样本学习),Few-Shot(少样本学习)概述
  • CVE-2023-41990/CVE-2023-32434/CVE-2023-38606/CVE-2023-32435
  • Spring事务管理深度解析:原理、实践与陷阱
  • 开发需要写单元测试吗?
  • 关键字前跟空格或首字母, 关键字后跟空格或标点符号; 标点符号后面不是必须跟空格;
  • 无监督光流,unflow, uflow,upflow
  • imx6ull-裸机学习实验14(下)——驱动DDR3和测试
  • 数组和指针回顾,练习与解析
  • OSCP官方靶场-Solstice WP
  • 【第二节】ubuntu server配置静态IP
  • (思维)洛谷 P3081 USACO13MAR Hill Walk 题解
  • 网络安全基础概念以及虚拟环境的搭建
  • alpinelinux的网络配置
  • ZW3D 二次开发-创建六面体方框