基于TLS协议的安全分析
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协议的安全分析相关推荐
- SSL/TLS协议交互流程分析
本文参考 SSL/TLS协议运行机制的概述 tls运行机制,这里不细说,建议细看 HTTPS与TLS The Transport Layer Security (TLS) Protocol v1.2 ...
- TLS协议分析 与 现代加密通信协议设计
本文目标: 学习鉴赏TLS协议的设计,透彻理解原理和重点细节 跟进一下密码学应用领域的历史和进展 整理现代加密通信协议设计的一般思路 本文有门槛,读者需要对现代密码学有清晰而系统的理解,建议花精力补足 ...
- 解密TLS协议全记录之Openssl的使用与Nginx Server的配置
引言 Openssl是TLS协议进行报文加密,安全通讯而用到的开源代码包,代码主要由C语言编写,我个人也只看了其中一部分代码,当作工具使用,没有深入分析. 其维基百科的链接:https://zh.wi ...
- SSL/TLS 协议简介与实例分析
作者:drinkey 以前读RFC时总结的一篇文章,主要介绍了SSL/TLS协议的相关知识,包括协议本身以及简单的密码学概念,以及用实例解析了HTTP over SSL的协商过程,在最后简要列出了SS ...
- 用wireshark抓包分析TLS协议
一.SSL/TLS简介 1.协议介绍 SSL/TLS是保护计算机网络通讯安全的一类加密协议,它们在传输层上给原先非安全的应用层协议提供加密保护,如非安全的HTTP协议即可被SSL/TLS保护形成安全的 ...
- TLS协议分析 (九) 现代加密通信协议设计
六. TLS协议给我们的启发 - 现代加密通信协议设计 在看了这么多的分析和案例之后,我们已经可以归纳出加密通信协议设计的普遍问题,和常见设计决策, 设计决策点: 四类基础算法 加密/MAC/签名/密 ...
- 【解决方案】基于国标GB28181协议视频智能分析平台EasyCVR/EasyGBS打造的智慧企业AR云景解决方案
在现今科技发展之下,如果说有什么能再次掀起产业更替大潮,第一时间我们想到的可能是VR/AR,VR/AR最有可能率先实现应用的九大领域:视频游戏.事件直播.视频娱乐.医疗保健.房地产.零售.教育.工程和 ...
- wireshark抓包分析SSL/TLS协议
SSL/TLS协议一般有两种握手过程,一种是SSL握手,一种是会话恢复.前些时候在写HTTP和HTTPS协议区别的时候介绍了SSL协议的相关理论知识,但多少还是有点抽象,今天我们可以通过wiresha ...
- 实战录 | 基于openflow协议的抓包分析
<实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...
最新文章
- nginx 稳定版 1.16.0 发布,支持动态加载 SSL 证书
- Linux内核中的进程等待与其实现解析
- Matplotlib基础(part2)--图形对象
- SpringCloud Ribbon(三)之IPing机制
- 从0到千万DAU,这5年闲鱼架构如何演进?
- 公众号文章折叠点击后展开案例_(案例)蜂窝纸板在包装中的应用内衬
- java8 optional使用_[Java8]如何正确使用Optional
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
- 哈理工计算机学院学生会技术部,计算机与信息学院学生会简介
- 130 个相见恨晚的超实用网站,一次性分享出来,十倍提高工作效率
- 嵌入式ttf字体裁减说明
- Python中更新pip版本的那些事
- PayPal接口查询账户各币种余额
- STM32F103C8T6最小系统原理图和PCB
- 如何重设思科路由器密码并保持配置不丢失?
- 软件测试体系学习及构建(8)-HTML之图像,表格,列表,区块
- 使用友盟进行app的增量更新
- 网站日志分析(二)——利用Quick BI制作企业化报表分析
- 【编程语言】函数式编程 Functional Programming
- linux ipv6模块,有关Linux ipv6模块加载失败的问题