1,基于TLS的Socket通信实现

1.1安装openssl
1.1.1下载地址:
http://slproweb.com/products/Win32OpenSSL.html。
1.1.2配置环境
控制面板->系统和安全->系统->高级系统设置->环境变量

1.1.3使用计算机终端切换保存路径

1.2生成CA证书
1.2.1创建CA私钥:genrsa -out ca-key.pem 2048
该命令含义如下:
genrsa——使用RSA算法产生私钥
-out——输出文件的路径
2048——指定私钥长度

1.2.2创建CA证书请求:req -new -out ca-req.csr -key ca-key.pem

该命令含义如下:
req——执行证书签发命令
-new——新证书签发请求
-out——输出的csr文件的路径
-key——指定私钥路径

1.2.3创建CA自签证书:x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 365

该命令的含义如下:
x509——生成x509格式证书
-req——输入csr文件
-in——输入的csr文件的路径
-out——输出的cer证书文件的路径
-signkey——签发证书的私钥

1.2.4生成结果目录如下:

1.3生成Server证书
1.3.1创建Server私钥:genrsa -out server-key.pem 2048

1.3.2创建Server证书请求:req -new -out server-req.csr -key server-key.pem

1.3.3创建自签Server证书:x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 365

该命令含义如下:
-CA——指定CA证书的路径
-CAkey——指定CA证书的私钥路径
-CAserial——指定证书序列号文件的路径
-CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀

1.3.4生成结果目录如下:

1.4python中安装openssl库
安装语句:pip install pyopenssl,import ssl无报错即安装成功。

2,实现代码

2.1服务器端实现代码

import socket
import sslclass server_ssl:def build_listen(self):# 生成SSL上下文context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)# 加载服务器所用证书和私钥context.load_cert_chain('E:\\pycharm\\ssl\\FILE\\server-cert.pem', 'E:\\pycharm\\ssl\\FILE\\server-key.pem')# 监听端口with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:sock.bind(('127.0.0.1', 7777))sock.listen(5)# 将socket打包成SSL socketwith context.wrap_socket(sock, server_side=True) as ssock:while True:# 接收客户端连接client_socket, addr = ssock.accept()msg = client_socket.recv(1024).decode("utf-8")print(f"receive msg from client {addr}:{msg}")# 向客户端发送信息msg = f"yes , you have client_socketect with server.\r\n".encode("utf-8")client_socket.send(msg)client_socket.close()
if __name__ == "__main__":server = server_ssl()server.build_listen()在这里插入代码片

2.2客户端实现代码

import socket
import sslclass client_ssl:def send_hello(self,):# 生成SSL上下文context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)# 加载信任根证书context.load_verify_locations('E:\\pycharm\\ssl\\FILE\\ca-cert.pem')#与服务端建立socket连接with socket.create_connection(('127.0.0.1',7777)) as sock:# 将socket打包成SSL socket# 注意的是这里的server_hostname不是指服务端IP,而是指服务端证书中设置的CNwith context.wrap_socket(sock, server_hostname='test') as ssock:msg = "do i connect with server ?".encode("utf-8")ssock.send(msg)# 接收服务端返回的信息msg = ssock.recv(1024).decode("utf-8")print(f"receive msg from server : {msg}")ssock.close()if __name__ == "__main__":client = client_ssl()client.send_hello()

2.3运行结果

3,抓包分析


3.1Client Hello:
TLS记录协议首部:

内容类型(Content Type:Handshake):TLS握手协议,占一字节,0x16

TLS版本(Version):TLS1.0,占两字节,0x0301

数据长度(Length):512字节,占两字节,0x0200

TLS握手内容:

握手类型(Handshake Type):客户Hello,占一字节,0x01;
握手消息长度(Length):508字节,占三字节,0x0001fc;
TLS协议版本(Version):TLS1.2,占两字节,0x0303;
客户生成的随机数(Random):占32字节,0x9bd8d15c9094b4823d8ef1f7347f7414281b9e8c9be796293fcb9e14a62223,其中前四字节是中国标准时间,0x9bd8d15c;
会话id长度(Session ID Length):0,占一字节,0x00;
密码套件长度(Cipher suites length):130字节,占两字节,0x0082;
密码套件(65种套件)(Cipher Suites(65 suites)):占130字节,其中每一种套件占两字节,密码套件由四部分组成(基于的协议-密钥协商交换算法-加密算法和加密模式-MAC算法);
压缩算法长度(Compression Methods Length):1字节,占一字节,0x01;
压缩算法(Compression Method):无,占一字节,0x00;
扩展长度(Extensions Length):337字节,占两字节,0x0151;
扩展:服务器名称
类型:服务器名称,占两字节,0x0000;
扩展长度:9字节,占两字节,0x0009;
服务器名称指示扩展:
服务器名称列表长度(Server Name list length):7字节,占两字节,0x0007;
服务器名称类型(Server Name Type):主机名,占1字节,0x00;
服务器名称长度(Server Name length):4字节,占2字节,0x0004
服务器名称(Server Name):test,占4字节,0x74657374
扩展:椭圆曲线点格式
类型(Type):椭圆曲线点格式,占2字节,0x000b;
扩展长度:4字节,占2字节,0x0004;
椭圆曲线点格式长度:3字节,占1字节,0x03;
椭圆曲线点格式:每个占1字节;

支持的椭圆曲线类型:有13种类型,每种类型占两个字节;

支持的签名算法:有15种类型,每种算法占两个字节;

3.2服务器Hello
TLS记录协议首部

内容类型(Content Type:Handshake):TLS握手协议,占一字节,0x16

TLS版本(Version):TLS1.2,占两字节,0x0303

数据长度(Length):66字节,占两字节,0x0042

TLS握手内容:


握手类型(Handshake Type):服务器 Hello,占一字节,0x02;
握手消息长度(Length):62字节,占三字节,0x00003e;
TLS协议版本(Version):TLS1.2,占两字节,0x0303;
客户生成的随机数(Random):占32字节,0x6405d04ce1b2de387353475a46cfbd5a6d901d4efc262690ba663afed8c70b86,其中前四字节是中国标准时间,0x6405d04c;
会话id长度(Session ID Length):0,占一字节,0x00;
选择的加密套件(Cipher Suite):TLS_ECDHE_RSA_AES_256_GCM_SHA384,占两字节,0xc030

3.3服务器发送自己的证书

握手类型:证书,占两字节,0x0b;
握手消息长度:854字节,占三字节,0x000356;
证书长度:851字节,占三字节,0x000353;
证书的内容如下:
证书内容的长度:848字节,占三字节,0x000350;
序列号:15977231136593676939,占9字节,0x00ddba871156fa0a8b;
使用的签名算法:sha256withRSAEncryption;
算法标识:1.2.840.113549.1.1.11,占9字节,0x2a864886f70d01010b;
国家名称:CN,占2字节,0x4341;
州或省名称:SC,占2字节,0x5343;
地区名称:CD,占2字节,0x4344;
组织名称:no,占2字节,0x6e6f;
组织单位名称:test,占4字节,0x74657374;
邮箱地址:test,占4字节,0x74657374;
填充长度:0字节,占1字节,0x00;
有效起始时间:2019/12/19 10;58:29,占13字节,0x3139313231393130353832395a;
有效截至时间:2020/12/18 10:58:29,占13字节,0x3230313231383130353832395a;
模数(n):

公开指数(e):65537,占两字节,0x010001;
加密后的数据:占256字节;

3.4服务器发送密钥交换

服务器选择的椭圆曲线类型:secp256r1,占两字节,0x0017;
公钥长度:65字节,占一字节,0x65;
哈希算法:SHA512,占1字节,0x06;
签名算法:RSA,占1字节,0x01;
签名长度:256字节,占1字节,0x0100;
签名内容:

3.5服务器hello完毕


握手类型:服务器hello完毕,占一字节,0x0e;

3.6用户密钥交换


握手类型:用户密钥交换,占1字节,0x10;
握手内容长度:66字节,占3字节,0x000042;
客户公钥长度:65字节,占1字节,0x41;
客户公钥长度:

3.7客户端发送更改密码规范

内容类型(Content Type:Handshake):改变密码规范协议,占1字节,0x14;
数据长度(Length):1字节,占两字节,0x0101;
数据内容:0x01;

3.8客户端发送加密的握手消息


消息长度:40字节,占两字节,0x0028;

3.9服务器发送新的会话票据

握手类型:新的会话票据,占1字节,0x04;
握手数据长度:186字节,占3字节,0x0000b6;
会话票据的生存时间:300秒,占4字节,0x0000012c;
会话票据长度:176字节,占2字节,0x00b0;
会话票据内容:

3.10服务器发改变密码规则

(跟客户发送的一样这里不再作出解释)

3.11服务器发送加密的握手消息


消息长度:40字节,占两字节,0x0028;

4.参考文献

1,https://blog.csdn.net/g1531997389/article/details/80048313;
2,https://blog.csdn.net/s030602122/article/details/53538383;
3,https://blog.csdn.net/ld11690/article/details/79205566;
4,https://baike.baidu.com/item/TLS/2979545?fr=aladdin;
5,<<网络安全>>沈鑫剡等编著,清华大学出版社

基于TLS协议的安全分析相关推荐

  1. SSL/TLS协议交互流程分析

    本文参考 SSL/TLS协议运行机制的概述 tls运行机制,这里不细说,建议细看 HTTPS与TLS The Transport Layer Security (TLS) Protocol v1.2 ...

  2. TLS协议分析 与 现代加密通信协议设计

    本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解,建议花精力补足 ...

  3. 解密TLS协议全记录之Openssl的使用与Nginx Server的配置

    引言 Openssl是TLS协议进行报文加密,安全通讯而用到的开源代码包,代码主要由C语言编写,我个人也只看了其中一部分代码,当作工具使用,没有深入分析. 其维基百科的链接:https://zh.wi ...

  4. SSL/TLS 协议简介与实例分析

    作者:drinkey 以前读RFC时总结的一篇文章,主要介绍了SSL/TLS协议的相关知识,包括协议本身以及简单的密码学概念,以及用实例解析了HTTP over SSL的协商过程,在最后简要列出了SS ...

  5. 用wireshark抓包分析TLS协议

    一.SSL/TLS简介 1.协议介绍 SSL/TLS是保护计算机网络通讯安全的一类加密协议,它们在传输层上给原先非安全的应用层协议提供加密保护,如非安全的HTTP协议即可被SSL/TLS保护形成安全的 ...

  6. TLS协议分析 (九) 现代加密通信协议设计

    六. TLS协议给我们的启发 - 现代加密通信协议设计 在看了这么多的分析和案例之后,我们已经可以归纳出加密通信协议设计的普遍问题,和常见设计决策, 设计决策点: 四类基础算法 加密/MAC/签名/密 ...

  7. 【解决方案】基于国标GB28181协议视频智能分析平台EasyCVR/EasyGBS打造的智慧企业AR云景解决方案

    在现今科技发展之下,如果说有什么能再次掀起产业更替大潮,第一时间我们想到的可能是VR/AR,VR/AR最有可能率先实现应用的九大领域:视频游戏.事件直播.视频娱乐.医疗保健.房地产.零售.教育.工程和 ...

  8. wireshark抓包分析SSL/TLS协议

    SSL/TLS协议一般有两种握手过程,一种是SSL握手,一种是会话恢复.前些时候在写HTTP和HTTPS协议区别的时候介绍了SSL协议的相关理论知识,但多少还是有点抽象,今天我们可以通过wiresha ...

  9. 实战录 | 基于openflow协议的抓包分析

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...

最新文章

  1. nginx 稳定版 1.16.0 发布,支持动态加载 SSL 证书
  2. Linux内核中的进程等待与其实现解析
  3. Matplotlib基础(part2)--图形对象
  4. SpringCloud Ribbon(三)之IPing机制
  5. 从0到千万DAU,这5年闲鱼架构如何演进?
  6. 公众号文章折叠点击后展开案例_(案例)蜂窝纸板在包装中的应用内衬
  7. java8 optional使用_[Java8]如何正确使用Optional
  8. hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
  9. 哈理工计算机学院学生会技术部,计算机与信息学院学生会简介
  10. 130 个相见恨晚的超实用网站,一次性分享出来,十倍提高工作效率
  11. 嵌入式ttf字体裁减说明
  12. Python中更新pip版本的那些事
  13. PayPal接口查询账户各币种余额
  14. STM32F103C8T6最小系统原理图和PCB
  15. 如何重设思科路由器密码并保持配置不丢失?
  16. 软件测试体系学习及构建(8)-HTML之图像,表格,列表,区块
  17. 使用友盟进行app的增量更新
  18. 网站日志分析(二)——利用Quick BI制作企业化报表分析
  19. 【编程语言】函数式编程 Functional Programming
  20. linux ipv6模块,有关Linux ipv6模块加载失败的问题

热门文章

  1. 点击计算机没有c盘,我的电脑C盘莫名其妙的满了,但里面基本什么都没有...
  2. 艺术碰撞NFT,BOBO爱好者沙龙大师云集
  3. appendTo的应用
  4. append appendTo after
  5. Matlab配置libsvm并实现官方教程
  6. 在ajax中拦截器的转发与重定向无效
  7. 【FLASH存储器系列十】ONFI数据接口的时序参数与时序图
  8. 倍福TwinCAT(贝福Beckhoff)基础教程2.1 TwinCAT常见类型简介
  9. windows7输入法修复
  10. Automative SPICE 之三 过程能力确定