TLS协议简单介绍

article/2025/10/16 22:21:05

TLS简介

介绍

TLS(Transport Layer Security)即安全传输层协议,在两个通信应用程序之间提供保密性和数据完整性。最典型的应用就是HTTPS。HTTPS,即HTTP over TLS,就是安全的HTTP,运行在HTTP层之下,TCP层之上,为HTTP层提供数据加解密服务。也可用于email,即时通信等。

TLS协议概论

       TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连接,防止在交换数据时受到窃听及篡改。
       TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。
       TLS协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的TLS协议通信端口(例如:用于HTTPS的端口443);另一个是客户端请求服务器连接到TLS时使用特定的协议机制(例如:邮件、新闻协议和STARTTLS)。一旦客户端和服务器都同意使用TLS协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据。通过握手,客户端和服务器协商各种参数用于创建安全连接:

  • 当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和散列算法),握手开始;
  • 服务器从该列表中决定加密算法和散列算法,并通知客户端;
  • 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥;
  • 客户端验证其收到的服务器证书的有效性;
  • 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密;
  • 利用随机数,双方生成用于加密和解密的对称密钥。这就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接。

TLS报文交互过程

详细讲解:https://zhuanlan.zhihu.com/p/440612523
tls报文交互
通过上图可知,我们这里说的TLS握手主要讲的是最基本的TLS握手,即只使用服务器的证书来进行加密,具体步骤如下:
1.客户端与服务器之间通过3次握手建立连接
2.协商阶段

a.client发送一个ClientHello消息给server,这个消息包含了client支持的最高的TLS协议版本,一个随机数,当前client支持的密码组列表和建议的压缩算法
b.server发送一个ServerHello消息给client,这个消息包含了TLS协议版本,一个服务器随机数,根据客户端支持的密码组列表最终选择的密码和最终选择的压缩算法。
c.server发送Certificate(证书)消息
d.server发送ServerKeyExchange消息
e.server发送ServerHelloDone消息,表明握手协商已经完成
f.client发送ClientKeyExchange消息,这个消息包含了PreMasterSecret(这个值是根据server发送的Certificate里面的public key通过加密生成的)和 public key。(注意在发送消息之前,client会对server发送的Certificate进行验证–可参考下面的数字证书,如果验证失败,则握手失败)
g.client和server根据client的随机数,server端的随机数和PreMasterSecret计算出一个共同的密码,这个共同的密码叫做master secret)

3.client发送ChangeCipherSpec记录,告诉server我后面发送的所有消息都会是加密的了

a.client发送一个已验证并且加密的Finished消息。包含了对之前消息的hash和mac
b.server对接收的Finished消息进行解密并验证hash和mac,如果验证失败,则握手失败

4.server发送ChangeCipherSpec消息,告诉client我后面发送的所有消息都会是加密的了

a.server发送一个已验证并且加密的Finished消息。包含了对之前消息的hash和mac
b.client 对接收的Finished消息进行解密并验证hash和mac,如果验证失败,则握手失败

5.应用阶段:此阶段说明TLS握手已经完成,后面所有发送的消息都会是加密的

TLS

openssl使用

服务器使用openssl生成证书

'
生成证书以及CA根证书
1.生成CA私钥
2.生成CA根证书
3.生成私钥
4.生成证书请求
5.根据证书请求、CA根证书、CA私钥生成证书(pem格式)。
'
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -subj "/C=US/ST=Utah/L=Lehi/O=Your Company, Inc./OU=IT/CN=rootca.com"
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/C=US/ST=Utah/L=Lehi/O=Your Company, Inc./OU=IT/CN=test-cert"
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.pem -days 1000 -sha256
'
server.pem证书
server.key 证书私钥
rootCA.pem CA根证书
rootCA.key CA根证书私钥
'Aes256加密的私钥:openssl genrsa -aes256  -passout pass:111111  -out CA.key 2048
使用私钥生成证书:openssl req -x509 -new -nodes -key CA.key -sha256 -days 1024 -out CA.pem -subj "/C=CN/ST=GD/L=SZ/O=CA/OU=dev/CN=CA.com/emailAddress=ca@ca.com" -passin pass:111111
CA签名证书:openssl x509 -req -in actor1.csr -CA CA.pem -CAkey CA.key -CAcreateserial -out actor1.pem -days 1000 -sha256 -passin pass:111111
#参考
#http://t.zoukankan.com/sxFu-p-13223332.html
#https://www.jianshu.com/p/4268191f762b

浏览器会提示证书无效,实际http报文已使用tls加密传输

在这里插入图片描述

简单的测试代码

#!/usr/bin/python3
import argparse
import socket
import ssl
import sys
import time
from http.server import HTTPServer, BaseHTTPRequestHandler
from http.client import HTTPSConnection# 基于原生socket的tls客户端
def client(host, port, cafile=None):#创建tcp socket套接字客户端raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)raw_sock.connect((host, port))print('Connected to host {!r} and port {}'.format(host, port))# 创建ssl客户端上下文context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)#context.check_hostname = False         #检查服务器主机名与服务器申请证书是主机名是否一致#context.verify_mode = ssl.CERT_NONE    #是否关闭CA校验,此设置只能在check_hostname关闭之后才能添加,关闭之后就不检查CA证书的真实性context.check_hostname = False          #此处设置不检查主机名#if not cafile:#    print("not find cafile!")#    sys.exit()context.load_verify_locations(cafile) # 导入CA证书,客户端使用CA证书验证服务器的证书'''# 如果服务器开启了验证客户端证书,则此处需要导入客户端的证书和私钥,一般WEB浏览器和服务端不启用。context.load_cert_chain(certfile=client_certfile,keyfile=client_keyfile)'''# ssl上下文与原生socket绑定,生成ssl_socket,# 作为客户端wrap_socket函数的server_side参数需要设置为Falsessl_sock = context.wrap_socket(raw_sock, server_side=False,server_hostname=host)while True:data = ssl_sock.recv(1024)print(repr(data))if not data:break# 基于原生socket的tls服务端
def server(host, port,certfile, keyfile,password=None,cafile=None,):# 创建tcp socket套接字服务端listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)listener.bind((host, port))listener.listen(1)print('Listening at interface {!r} and port {}'.format(host, port))raw_sock, address = listener.accept()print('Connection from host {!r} and port {}'.format(*address))#创建ssl服务端上下文context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)if cafile:# 服务端是否验证客户端证书,如果需要则需要导入CA证书context.load_verify_locations(cafile)#服务端需要导入自己的证书和自己的私钥,用于客户端验证context.load_cert_chain(certfile=certfile,keyfile=keyfile,password=password)# ssl上下文与原生socket绑定,生成ssl_socket# 作为服务wrap_socket函数的server_side参数需要设置为Truessl_sock = context.wrap_socket(raw_sock, server_side=True)while True:try:time.sleep(2)ssl_sock.sendall('Simple test.'.encode('utf-8'))except Exception:breakssl_sock.close()'''
# https的例子
def client(host, port, cafile=None):params = urllib.parse.urlencode({})context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)context.check_hostname = Falsecontext.load_verify_locations('rootCA.pem')conn = HTTPSConnection(host=host,port=port,context=context)conn.request("GET", "/",params)r1 = conn.getresponse()print(r1.status)#print(r1.read().decode('utf-8'))
# server
class requesthandler(BaseHTTPRequestHandler):def do_GET(self):self.send_response(200)self.send_header("Content-type","text/html")self.end_headers()self.wfile.write("<html><body>get success</body></html>".encode('utf-8'))def do_POST(self):self.send_response(200)self.send_header('Content-type', 'application/json')self.end_headers()self.wfile.write("<html><body>post success</body></html>".encode('utf-8'))
def server(host, port, certfile, cafile=None):httpd = HTTPServer((host, port), requesthandler)context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)context.load_cert_chain('server.pem', 'server.key')httpd.socket = context.wrap_socket(httpd.socket, server_side=True)httpd.serve_forever()
'''if __name__ == '__main__':parser = argparse.ArgumentParser(description='Safe TLS client and server')parser.add_argument('host', help='hostname or IP address')parser.add_argument('port', type=int, help='TCP port number')parser.add_argument('-a', dest='cafile', metavar='CAFILE',default=None,help='authority: path to CA certificate PEM file')parser.add_argument('-k', dest='keyfile', metavar='KEYFILE',default=None,help='run as server : path to server  keyfile file')parser.add_argument('-s', dest='certfile',metavar='CERTFILE', default=None,help='run as server: path to server certfile PEM file')parser.add_argument('-p', dest='password',metavar='PASSWD', default=None,help='run as server: cert password!')args = parser.parse_args()if args.certfile:server(args.host, args.port, args.certfile, args.keyfile,args.password,args.cafile)else:client(args.host, args.port, args.cafile)

http://chatgpt.dhexx.cn/article/hXqeVafG.shtml

相关文章

esp-idf的内存管理——tlsf之上的封装

目录 1 为什么要封装2 先看结构2.1 multi heapnote1note2 2.2 heap caps2.3 层次关系 3 再看接口3.1 内存的申请3.2 内存的释放3.2 堆完整性检测3.3 其它 参考 1 为什么要封装 封装通常会降低效率&#xff0c;但能够带来诸如通用性提升等好处&#xff0c;idf在tlsf的基础上增加…

SSL/TLS 证书管理

SSL 证书发现 随着组织的 IT 基础架构的扩展&#xff0c;他们为每台计算机获取证书以保护其资源和域。此外&#xff0c;开发人员通常会创建许多自签名证书&#xff0c;以便在产品的开发阶段保护内部网络。组织通常最终会拥有数千个证书。自动发现证书提供了对证书基础结构的完…

TLS协议。

IPSec通过安全关联实现IP分组安全关联两端之间的安全传输过程&#xff0c;TLS通过建立安全连接实现数据在两个应用进程之间的安全传输过程。TLS建立安全连接时&#xff0c;实现安全连接两端应用进程之间的双向身份鉴别过程&#xff0c;保证经过安全连接传输的数据的保密性和完整…

SSL/TLS协议

SSL/TLS协议 文章目录 SSL/TLS协议1 协议历史2 协议的目标3 SSL体系结构4 两个主要的协议5 SSL的两个重要概念6 会话状态参数7 连接状态参数8 SSL Record Protocol9 SSL记录协议中的操作10 SSL握手协议使用的消息11 SSL握手协议的流程 1 协议历史 1994年Netscape开发了SSL(Sec…

tls协议

tls 前言一、TLS 协议的组成二、ECDHE1.连接过程 三、TLS1.31.过程 前言 tls是ssl协议的标准化&#xff0c;处于应用层(5层架构)和会话层(OSI)&#xff0c;有着rsa方式和ecdhe两种&#xff0c; 一、TLS 协议的组成 握手协议&#xff1a;负责在客户端和服务器之间协商决定密码算…

TLS协议详解!

TLS简介 SSL 即安全套接字层&#xff0c;它在 OSI 七层网络模型中处于第五层&#xff0c;SSL 在 1999 年被 IETF(互联网工程组)更名为 TLS &#xff0c;即传输安全层&#xff0c;直到现在&#xff0c;TLS 一共出现过三个版本&#xff0c;1.1、1.2 和 1.3 &#xff0c;目前最广…

esp-idf的内存管理——tlsf算法

目录 1 最初还不是tlsf2 为什么要引入tlsf3 tlsf算法概览4 idf中使用的tlsf算法的设计与实现4.1 先看结构4.1.1 管理内存块的结构4.1.2 管理tlsf堆的结构 4.2 优化内存块的元数据开销4.3 一二级位图索引的计算4.4 tlsf堆的创建与销毁4.4.1 tlsf堆的创建4.4.2 tlsf堆的销毁 4.5 …

TLSF算法1:二级索引的计算

TLSF算法1:二级索引的计算 一、什么是TLSF算法二,f的确定三、s的确定四、实验结果一、什么是TLSF算法 在嵌入式系统中,内存需要在分配和释放时有一个确定的相应时间,才能进一步分析其实时任务的可调度性。因此TLSF算法是一个十分适用嵌入式领域的动态内存分配算法。在关于T…

TLSF 内存分配算法详解

文章目录 1. DSA 背景介绍1.1 mmheap1.2 mmblk 2. TLSF 原理2.1 存储结构2.2 内存池初始化2.3 free2.4 malloc 参考资料 1. DSA 背景介绍 动态内存管理算法 DSA&#xff0c;Dynamic storage allocation。RTOS 一般情况下动态内存使用malloc申请分配&#xff0c;但是存在两个缺…

tlsf算法-概念、原理、内存碎片问题分析

文章目录 一、tlsf算法介绍二、tlsf代码分析2.1 mapping_search2.2 search_suitable_block 三、参考链接 一、tlsf算法介绍 tlsf&#xff08;全称Two-Level Segregated Fit&#xff0c;内存两级分割策略算法&#xff09;&#xff0c;第一级&#xff08;first level&#xff0c…

数学建模系列-优化模型(三)---排队论模型

所谓排队论模型&#xff0c;就是指一个模型中可根据交易简单的需要分为三个部分&#xff1a; &#xff08;1&#xff09;顾客造访 &#xff08;2&#xff09;服务顾客时间 &#xff08;3&#xff09;若不空闲&#xff0c;则顾客需要排队 下面是对于排队论模型的建模以及解决方法…

无线传感器网络:排队论(Queueing Theory)模型

文章目录 The arrival ProcessQueueing SystemThe M/M/1 queueThe M/M/1/N queue References 排队理论已被用于评估通信网络的性能很多年了。早在1917年&#xff0c;丹麦数学家 Erlang 就将该理论用于电话交换机的设计&#xff0c;并开创了现在著名的 Erlang-B 和 Erlang-C 公式…

排队论(Queuing theory)简介

Preliminary Questions 1.What does affect the performance of ——a computer system? ——a computer network? ——an Internet service? 2 How do we measure the performance of ——a computer system? ——a computer network? ——an Internet service…

泊松分布,指数分布与排队论模型

转自http://www.ruanyifeng.com/blog/2015/06/poisson-distribution.html泊松分布和指数分布&#xff1a;10分钟教程 https://www.bilibili.com/video/BV1L5411x7vH?p44北京工业大学运筹学 泊松分布与指数分布 泊松分布 泊松分布就是描述某段时间内&#xff0c;事件具体的…

排队论模型之M/M/S模型

相关参数 模型推导 例题 代码实现&#xff1a; s3; %服务台的个数 mu0.4; %单位时间内能服务的顾客数 lambda0.9; %单位时间内到达的顾客数rolambda/mu; rosro/s; sum10; %求解P0时把其分成两部分计算&#xff0c;分别为sum1,sum2 for i0:(s-1) sum1sum1ro.^i/factorial(i); …

排队模型和排队系统仿真

排队模型和排队系统仿真 Gary哥哥 2021.1.31 排队论又称随机服务系统&#xff0c;是研究系统随机聚散现象和随机服务系统工作过程的数学理论和方法&#xff0c;是运筹学的一个分支。排队论的基本思想是 1909 年丹麦数学家 A.K. 埃尔朗在解决自动电话设计问题时开始形成的&#…

数学模型算法实现之排队论

排队问题 https://wenku.baidu.com/view/475f68cb65ce0508763213a7.html 排队论详解 排队论又叫随机服务系统理论或公用事业管理中的数学方法。它是研究各种各样的排队现象的。它所要解决的主要问题是:在排队现象中设法寻求能够达到服务标准的最少设备,使得在满足服务对象…

排队论模型(二):生灭过程 、 M / M /s 等待制排队模型、多服务台模型

排队论模型&#xff08;一&#xff09;&#xff1a;基本概念、输入过程与服务时间的常用概率分布 排队论模型&#xff08;二&#xff09;&#xff1a;生灭过程 、 M / M /s 等待制排队模型、多服务台模型 排队论模型&#xff08;三&#xff09;&#xff1a;M / M / s/ s 损失…

排队论模型(四):M / M / s 混合制排队模型

排队论模型&#xff08;一&#xff09;&#xff1a;基本概念、输入过程与服务时间的常用概率分布 排队论模型&#xff08;二&#xff09;&#xff1a;生灭过程 、 M / M /s 等待制排队模型、多服务台模型 排队论模型&#xff08;三&#xff09;&#xff1a;M / M / s/ s 损失…

浅谈排队论

排队论起源于 1909 年丹麦电话工程师 A. K&#xff0e;爱尔朗的工作&#xff0c;他对电话通话拥挤问 题进行了研究。1917 年&#xff0c;爱尔朗发表了他的著名的文章—“自动电话交换中的概率理 论的几个问题的解决”。排队论已广泛应用于解决军事、运输、维修、生产、服务、库…