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.pswp.cn/web/88810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88810.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uni-app uni-push 2.0推送圖標不展示問題

問題現象:我在uni-app的配置文件,配置了推送的大圖標小圖標發現在真機測試無法展示配置的推送圖標問題 官網文檔:開通 | uni-app官網 解決方法: 在uni-app官網中說的并不是很清楚只給了一個簡單的示例,配置并沒有告訴我…

scp:上傳大型數據集到實驗室服務器

我通過百度網盤下載了大概200GB的LUNA-2016的肺結節CT數據。實驗是在實驗室服務器上進行的,我現在需要將本地的數據集傳輸到實驗室的服務器上。我已經通過remote-ssh連接上了實驗室的服務器,但是如果通過這個插件上傳數據的話,一方面不支持上…

量子計算突破:8比特擴散模型實現指數級加速

目錄 一、量子擴散模型(Quantum Diffusion) 二、DNA存儲生成(Biological-GAN) 三、光子計算加速 四、神經形態生成 五、引力場渲染 六、分子級生成 七、星際生成網絡 八、元生成系統 極限挑戰方向 一、量子擴散模型&…

Flask3.1打造極簡CMS系統

基于Flask 3.1和Python 3.13的簡易CMS以下是一個基于Flask 3.1和Python 3.13的簡易CMS管理系統實現方案,包含核心功能和可運行代碼示例。環境準備安裝Flask和其他依賴庫:pip install flask3.1.0 flask-sqlalchemy flask-login配置數據庫在config.py中設置…

用 Node.js 構建模塊化的 CLI 腳手架工具,從 GitHub 下載遠程模板

本文將手把手帶你構建一個支持遠程模板下載、自定義項目名稱,并完成模塊化拆分的 CLI 腳手架工具,適用于初創項目、團隊內部工具或者開源項目快速初始化。🧩 為什么要自己造一個 CLI 腳手架? 在日常開發中,我們常用腳手…

08.如何正確關閉文件

如何正確關閉文件(File Handling Best Practices) 文件操作是日常開發中非常常見的任務,正確關閉文件對于避免資源泄漏尤為關鍵。錯誤的文件關閉方式可能導致文件未保存、鎖定或其他異常。 1. 常見的錯誤方式:手動 close() 許多初學者會手動調用 close() 關閉文件,這在異…

算法入門--動態規劃(C++)

深入淺出掌握動態規劃核心思想,圖文并茂實戰代碼 什么是動態規劃? 動態規劃(Dynamic Programming, DP) 是一種高效解決多階段決策問題的方法。它通過將復雜問題分解為重疊子問題,并存儲子問題的解(避免重…

[2025CVPR]GNN-ViTCap:用于病理圖像分類與描述模型

論文結構解析? 本文采用經典學術論文結構: ?引言?:闡述病理圖像分析的挑戰與現有方法局限性?相關工作?:系統梳理MIL、視覺語言預訓練和生物醫學語言模型三大領域?方法?:詳細闡述GNN-ViTCap四階段架構?實驗?:在BreakHis和PatchGastric數據集驗證性能?討論?:通…

Java SE--圖書管理系統模擬實現

一.設計思路首先這個系統可以由倆種用戶使用,分別為管理者用戶和普通者用戶,根據不同的用戶有不同的界面,每個界面有不同的功能。二.代碼實現創建三個包和一個類book包:包括Book類和Booklist類Book類:package book; pu…

[RPA] 批量數據抓取指定商品名稱信息

影刀RPA案例:批量數據抓取指定商品名稱信息流程圖:操作步驟:涉及的影刀RPA大致指令: 1. 打開影刀商城頁面 2. 使用【填寫輸入框(web)】指令輸入用戶名和密碼,并點擊"登錄"按鈕 3. 切換到"訂單管理"…

我的世界Java版1.21.4的Fabric模組開發教程(十四)方塊實體

這是適用于Minecraft Java版1.21.4的Fabric模組開發系列教程專欄第十四章——方塊實體。想要閱讀其他內容,請查看或訂閱上面的專欄。 方塊實體(Block Entity) 指的是一種用于存儲方塊額外數據的方法。但這種數據和為了控制方塊狀態而在自定義方塊類中創建的屬性不太…

【UE教程/進階】UE中的指針與引用

目錄直接屬性引用共享指針 TSharedPtr實現原理共享引用 TSharedRef弱引用指針 TWeakPtrObject弱指針 FWeakPtr實現原理Object軟指針 FSoftObjectPtr原理直接屬性引用 在c通過UPROPERTY()宏將屬性公開,藍圖中屬性類型中的Object Reference。 對一個類型及其子類型的…

早期 CNN 的經典模型—卷積神經網絡(LeNet)

目錄 LeNet 的設計背景與目標 LeNet 的網絡結構(經典 LeNet-5) 局部感受野詳解 一、局部感受野和全連接網絡的區別 1. 傳統全連接網絡的問題 2. 局部感受野的解決方案 二、局部感受野的優勢 1. 參數大幅減少 2. 提取局部特征 3. 平移不變性 參數…

RabbitMQ 高級特性之延遲隊列

1. 簡介 在某些場景下,當生產者發送消息后,可能不需要讓消費者立即接收到,而是讓消息延遲一段時間后再發送給消費者。 2. 實現方式 2.1 TTL 死信隊列 給消息設置過期時間后,若消息在這段時間內沒有被消費,就會將消…

uniapp app安卓下載文件 圖片 doc xls 數據流文件 app安卓本地路徑下載保存

//下載圖片 downloadToLocal() {plus.android.requestPermissions([android.permission.WRITE_EXTERNAL_STORAGE],(success) > {uni.saveImageToPhotosAlbum({filePath: /static/x.png,//本地地址success: () > {this.$refs.uToast.show({message: "模版下載成功&am…

Context Engineering:從Prompt Engineering到上下文工程的演進

最近在做Deepresearch以及刷到一個不錯的文章:context-engineering-guide ,這篇文章揭示了提示工程以及上下文過程在智能體應用開源流程中,包括Deepresearch,MCP在內的一些概念,起到了非常重要的作用! Cont…

jenkins部署vue前端項目

文章目錄前言一、安裝nginx二、jenkins構建項目總結前言 前面已經使用jenkins部署了后端springboot項目,現在開始學習jenkins部署前端Vue項目。 一、安裝nginx 訪問nginx官網,https://nginx.org/en/download.html下載tar包 上傳到服務器目錄中 然后到…

設計總監年中復盤:用Adobe XD內容識別布局,告別“手動調距”

時至年中,這不僅是檢視上半年項目成果的節點,更是優化團隊工作流、為下半年挑戰儲備動能的關鍵時期。在海外設計界工作的十余年間,我發現,一個高效的設計團隊與一個疲于奔命的團隊之間,最大的差別往往就在于是否建立了…

Unity 在Rider中通過Lingma插件使用MCP

環境: Unity 2022.3.12f1 JetBrains Rider 2025.1.4 Lingma 2.5.14 Python 3.13.4 下載包 首先在unity package manager 加入unity-mcp包 https://github.com/justinpbarnett/unity-mcp.git 然后下載uv包(要先先下載python),網上很多…

pycharm+SSH 深度學習項目 遠程后臺運行命令

pycharmSSH 深度學習項目 遠程后臺運行命令碎碎念,都是實驗室里那說關機就關機,說重啟就重啟的臺式機逼得。。學吧記錄 運行:nohup /root/miniconda3/bin/python -u "run.py" > /root/log/nohup.log 2>&1 &實時查看日…