TLS 详解

36 篇文章 12 订阅
订阅专栏

一、TLS 定义

SSL(Secure Sockets Layer) 安全套接层,是一种安全协议,经历了 SSL 1.0、2.0、3.0 版本后发展成了标准安全协议 - TLS(Transport Layer Security) 传输层安全性协议。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。

TLS 在实现上分为 记录层握手层 两层,其中握手层又含四个子协议: 握手协议 (handshake protocol)、更改加密规范协议 (change cipher spec protocol)、应用数据协议 (application data protocol) 和警告协议 (alert protocol)。

二、HTTPS = HTTP over TLS

只需配置浏览器和服务器相关设置开启 TLS,即可实现 HTTPS,TLS 高度解耦,可装可卸,与上层高级应用层协议相互协作又相互独立

三、加密

TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 Hash对称加密非对称加密,其利用非对称加密实现身份认证和密钥协商对称加密算法采用协商的密钥对数据加密基于散列函数验证信息的完整性

TLS 的基本工作方式是,客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。

例如,在 HTTPS 协议中,客户端发出请求,服务端会将公钥发给客户端,客户端验证过后生成一个密钥再用公钥加密后发送给服务端(非对称加密),双方会在 TLS 握手过程中生成一个协商密钥(对称密钥),成功后建立加密连接。通信过程中客户端将请求数据用协商密钥加密后发送,服务端也用协商密钥解密,响应也用相同的协商密钥。后续的通信使用对称加密是因为对称加解密快,而握手过程中非对称加密可以保证加密的有效性,但是过程复杂,计算量相对来说也大。

四、 记录层

记录协议负责在传输连接上交换的所有底层消息,并且可以配置加密。每一条 TLS 记录以一个短标头开始。标头包含记录内容的类型 (或子协议)、协议版本和长度。原始消息经过分段 (或者合并)、压缩、添加认证码、加密转为 TLS 记录的数据部分。 

分片 (Fragmentation)

记录层将信息块分割成携带 2^14 字节 (16KB) 或更小块的数据的 TLSPlaintext 记录。

记录协议传输由其他协议层提交给它的不透明数据缓冲区。如果缓冲区超过记录的长度限制(2^14),记录协议会将其切分成更小的片段。反过来也是可能的,属于同一个子协议的小缓冲区也可以组合成一个单独的记录。

struct {
  uint8 major, minor;
} ProtocolVersion;

enum {
  change_cipher_spec(20),
  alert(21),
  handshake(22),
  application_data(23), (255)
} ContentType;

struct {
  ContentType type; // 用于处理封闭片段的较高级协议
  ProtocolVersion version; // 使用的安全协议版本
  uint16 length; // TLSPlaintext.fragment 的长度(以字节为单位),不超过 2^14
  opaque fragment[TLSPlaintext.length]; // 透明的应用数据,被视为独立的块,由类型字段指定的较高级协议处理
} TLSPlaintext;


记录压缩和解压缩 (Record compression and decompression)

压缩算法将 TLSPlaintext 结构转换为 TLSCompressed 结构。如果定义 CompressionMethod 为 null 表示不压缩

struct {
  ContentType type; // same as TLSPlaintext.type
  ProtocolVersion version; // same as TLSPlaintext.version
  uint16 length; // TLSCompressed.fragment 的长度,不超过 2^14 + 1024
  opaque fragment[TLSCompressed.length];
} TLSCompressed;

空或标准流加密 (Null or standard stream cipher) 

流加密(BulkCipherAlgorithm)将 TLSCompressed.fragment 结构转换为流 TLSCiphertext.fragment 结构

stream-ciphered struct {
    opaque content[TLSCompressed.length];
    opaque MAC[CipherSpec.hash_size];
} GenericStreamCipher;

 MAC 产生方法如下:

HMAC_hash(MAC_write_secret, seq_num + TLSCompressed.type + TLSCompressed.version + TLSCompressed.length + TLSCompressed.fragment));

 seq_num(记录的序列号)、hash(SecurityParameters.mac_algorithm 指定的哈希算法)

MAC(Message authentication code) - 消息认证码

注意,MAC 是在加密之前计算的。流加密加密整个块,包括 MAC。对于不使用同步向量 (例如 RC4) 的流加密,从一个记录结尾处的流加密状态仅用于后续数据包。如果 CipherSuite 是 TLS_NULL_WITH_NULL_NULL,则加密由身份操作 (数据未加密,MAC 大小为零,暗示不使用 MAC) 组成。TLSCiphertext.length 是 TLSCompressed.length 加上 CipherSpec.hash_size。

CBC 块加密 (分组加密)

块加密(如 RC2 或 DES),将 TLSCompressed.fragment 结构转换为块 TLSCiphertext.fragment 结构

block-ciphered struct {
  opaque content[TLSCompressed.length];
  opaque MAC[CipherSpec.hash_size];
  uint8 padding[GenericBlockCipher.padding_length];
  uint8 padding_length;
} GenericBlockCipher;

padding: 添加的填充将明文长度强制为块密码块长度的整数倍。填充可以是长达 255 字节的任何长度,只要满足 TLSCiphertext.length 是块长度的整数倍。长度大于需要的值可以阻止基于分析交换信息长度的协议攻击。填充数据向量中的每个 uint8 必须填入填充长度值 (即 padding_length)。

padding_length: 填充长度应该使得 GenericBlockCipher 结构的总大小是加密块长度的倍数。合法值范围从零到 255(含)。该长度指定 padding_length 字段本身除外的填充字段的长度

加密块的数据长度(TLSCiphertext.length)是 TLSCompressed.length,CipherSpec.hash_size 和 padding_length 的总和加一

示例: 如果块长度为 8 字节,压缩内容长度(TLSCompressed.length)为 61 字节,MAC 长度为 20 字节,则填充前的长度为 82 字节(padding_length 占 1 字节)。 因此,为了使总长度为块长度 (8 字节) 的偶数倍,模 8 的填充长度必须等于 6,所以填充长度可以为 6,14,22 等。如果填充长度是需要的最小值,比如 6,填充将为 6 字节,每个块都包含值 6。因此,块加密之前的 GenericBlockCipher 的最后 8 个八位字节将为 xx 06 06 06 06 06 06 06,其中 xx 是 MAC 的最后一个八位字节。

XX  - 06 06 06 06 06 06 - 06
MAC -     padding[6]    - padding_length

记录有效载荷保护 (Record payload protection) 

加密和 MAC 功能将 TLSCompressed 结构转换为 TLSCiphertext。记录的 MAC 还包括序列号,以便可以检测到丢失,额外或重复的消息。

struct {
  ContentType type; // same
  ProtocolVersion version; // same
  uint16 length; // TLSCiphertext.fragment 的长度,不超过 2^14 + 2048
  select (CipherSpec.cipher_type) {
    case stream: GenericStreamCipher;
    case block: GenericBlockCipher;
  } fragment; // TLSCompressed.fragment 的加密形式,带有 MAC
} TLSCiphertext;

注意 这里提到的都是先 MAC 再加密,是基于 RFC 2246 的方案 (TLS 1.0) 写的。但新的方案选择先加密再 MAC,这种替代方案中,首先对明文和填充进行加密,再将结果交给 MAC 算法。这可以保证主动网络攻击者不能操纵任何加密数据。 

密钥计算 (Key calculation) 

记录协议需要一种算法,从握手协议提供的安全性参数生成密钥、IV 和 MAC secret.

主密钥 (Master secret): 在连接中双方共享的一个 48 字节的密钥

客户随机数 (client random): 由客户端提供的 32 字节值

服务器随机数 (server random): 由服务器提供的 32 字节值

五、握手层 

  • 握手协议的职责是生成通信过程所需的共享密钥进行身份认证。这部分使用无密码套件,为防止数据被窃听,通过公钥密码或 Diffie-Hellman 密钥交换技术通信。
  • 密码规格变更协议,用于密码切换的同步,是在握手协议之后的协议。握手协议过程中使用的协议是“不加密”这一密码套件握手协议完成后则使用协商好的密码套件
  • 警告协议,当发生错误时使用该协议通知通信对方,如握手过程中发生异常、消息认证码错误、数据无法解压缩等。
  • 应用数据协议,通信双方真正进行应用数据传输的协议,传送过程通过 TLS 应用数据协议和 TLS 记录协议来进行传输。

握手是 TLS 协议中最精密复杂的部分。在这个过程中,通信双方协商连接参数,并且完成身 份验证。根据使用的功能的不同,整个过程通常需要交换 6~10 条消息。根据配置和支持的协议扩展的不同,交换过程可能有许多变种。在使用中经常可以观察到以下三种流程:(1) 完整的握手, 对服务器进行身份验证;(2) 恢复之前的会话采用的简短握手;(3) 对客户端和服务器都进行身份验证的握手。

握手协议消息的标头信息包含消息类型(1 字节)和长度(3 字节),余下的信息则取决于消息类型:

struct {
  HandshakeType msg_type;
  uint24 length;
  HandshakeMessage message;
} Handshake;

1、完整握手 

每一个 TLS 连接都会以握手开始。如果客户端此前并未与服务器建立会话,那么双方会执行一次完整的握手流程来协商 TLS 会话。握手过程中,客户端和服务器将进行以下四个主要步骤:

  • 交换各自支持的功能,对需要的连接参数达成一致
  • 验证出示的证书,或使用其他方式进行身份验证
  • 对将用于保护会话的共享主密钥达成一致
  • 验证握手消息并未被第三方团体修改

下面介绍最常见的握手规则,一种不需要验证客户端身份但需要验证服务器身份的握手:

 

a、ClientHello

这条消息将客户端的功能和首选项传送给服务器。

  • Version: 协议版本(protocol version)指示客户端支持的最佳协议版本
  • Random: 一个 32 字节数据,28 字节是随机生成的 (图中的 Random Bytes);剩余的 4 字节包含额外的信息,与客户端时钟有关 (图中使用的是 GMT Unix Time)。在握手时,客户端和服务器都会提供随机数,客户端的暂记作 random_C (用于后续的密钥的生成)。这种随机性对每次握手都是独一无二的,在身份验证中起着举足轻重的作用。它可以防止重放攻击,并确认初始数据交换的完整性。
  • Session ID: 在第一次连接时,会话 ID(session ID)字段是空的,这表示客户端并不希望恢复某个已存在的会话。典型的会话 ID 包含 32 字节随机生成的数据,一般由服务端生成通过 ServerHello 返回给客户端。
  • Cipher Suites: 密码套件(cipher suite)块是由客户端支持的所有密码套件组成的列表,该列表是按优先级顺序排列的
  • Compression: 客户端可以提交一个或多个支持压缩的方法。默认的压缩方法是 null,代表没有压缩
  • Extensions: 扩展(extension)块由任意数量的扩展组成。这些扩展会携带额外数据

b、ServerHello 

是将服务器选择的连接参数传回客户端。

 这个消息的结构与 ClientHello 类似,只是每个字段只包含一个选项,其中包含服务端的 random_S 参数 (用于后续的密钥协商)。服务器无需支持客户端支持的最佳版本。如果服务器不支持与客户端相同的版本,可以提供某个其他版本以期待客户端能够接受。

图中的 Cipher Suite 是后续密钥协商和身份验证要用的加密套件,此处选择的密钥交换与签名算法是 ECDHE_RSA,对称加密算法是 AES-GCM,后面会讲到这个。

还有一点默认情况下 TLS 压缩都是关闭的,因为CRIME攻击会利用 TLS 压缩恢复加密认证 cookie,实现会话劫持,而且一般配置 gzip 等内容压缩后再压缩 TLS 分片效益不大又额外占用资源,所以一般都关闭 TLS 压缩。

c、Certificate 

典型的 Certificate 消息用于携带服务器 X.509证书链。 服务器必须保证它发送的证书与选择的算法套件一致。比方说,公钥算法与套件中使用的必须匹配。除此以外,一些密钥交换算法依赖嵌入证书的特定数据,而且要求证书必须以客户端支持的算法签名。所有这些都表明服务器需要配置多个证书(每个证书可能会配备不同的证书链)。

Certificate 消息是可选的,因为并非所有套件都使用身份验证,也并非所有身份验证方法都需要证书。更进一步说,虽然消息默认使用 X.509 证书,但是也可以携带其他形式的标志;一些套件就依赖PCG密钥。

d、ServerKeyExchange 

携带密钥交换需要的额外数据。ServerKeyExchange 是可选的,消息内容对于不同的协商算法套件会存在差异。部分场景下,比如使用 RSA 算法时,服务器不需要发送此消息。

ServerKeyExchange 仅在服务器证书消息(也就是上述 Certificate 消息)不包含足够的数据以允许客户端交换预主密钥(premaster secret)时才由服务器发送。

比如基于 DH 算法的握手过程中,需要单独发送一条 ServerKeyExchange 消息带上 DH 参数:

 

e、ServerHelloDone

表明服务器已经将所有预计的握手消息发送完毕。在此之后,服务器会等待客户端发送消息。

f、verify certificate

客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证内容包括如下:

  • 证书链的可信性 trusted certificate path;
  • 证书是否吊销 revocation,有两类方式 - 离线 CRL 与在线 OCSP,不同的客户端行为会不同;
  • 有效期 expiry date,证书是否在有效时间范围;
  • 域名 domain,核查证书域名是否与当前的访问域名匹配;

PKI 体系 的内容可知,对端发来的证书签名是 CA 私钥加密的接收到证书后,先读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要然后利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性;然后去查询证书的吊销情况等。

g、 ClientKeyExchange

合法性验证通过之后,客户端计算产生随机数字的预主密钥(Pre-master),并用证书公钥加密,发送给服务器并携带客户端为密钥交换提供的所有信息。这个消息受协商的密码套件的影响,内容随着不同的协商密码套件而不同。

此时客户端已经获取全部的计算协商密钥需要的信息: 两个明文随机数 random_Crandom_S 自己计算产生的 Pre-master,然后得到协商密钥(用于之后的消息加密)。

enc_key = PRF(Pre_master, "master secret", random_C + random_S)

图中使用的是 ECDHE 算法,ClientKeyExchange 传递的是 DH 算法的客户端参数,如果使用的是 RSA 算法则此处应该传递加密的预主密钥。

h、ChangeCipherSpec

通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信。

注意:ChangeCipherSpec 不属于握手消息,它是另一种协议,只有一条消息,作为它的子协议进行实现。

i、Finished (Encrypted Handshake Message)

Finished 消息意味着握手已经完成。消息内容将加密,以便双方可以安全地交换验证整个握手完整性所需的数据。

这个消息包含 verify_data 字段,它的值是握手过程中所有消息的散列值。这些消息在连接两端都按照各自所见的顺序排列,并以协商得到的主密钥 (enc_key) 计算散列。这个过程是通过一个伪随机函数(pseudorandom function,PRF)来完成的,这个函数可以生成任意数量的伪随机数据。 两端的计算方法一致,但会使用不同的标签(finished_label):客户端使用 client finished,而服务器则使用 server finished。

verify_data = PRF(master_secret, finished_label, Hash(handshake_messages))

因为 Finished 消息是加密的,并且它们的完整性由协商 MAC 算法保证,所以主动网络攻击者不能改变握手消息并对 vertify_data 的值造假。在 TLS 1.2 版本中,Finished 消息的长度默认是 12 字节(96 位),并且允许密码套件使用更长的长度。在此之前的版本,除了 SSL 3 使用 36 字节的定长消息,其他版本都使用 12 字节的定长消息。

j、Server

服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 random_C 和 random_S,同样计算得到协商密钥: enc_key = PRF(Pre_master, "master secret", random_C + random_S);

同样计算之前所有收发信息的 hash 值,然后用协商密钥解密客户端发送的 verify_data_C,验证消息正确性;

k、change_cipher_spec

服务端验证通过之后,服务器同样发送 change_cipher_spec 以告知客户端后续的通信都采用协商的密钥与算法进行加密通信(图中多了一步 New Session Ticket,此为会话票证,会在会话恢复中解释);

l、Finished (Encrypted Handshake Message)

服务器也结合所有当前的通信参数信息生成一段数据 (verify_data_S) 并采用协商密钥 session secret (enc_key) 与算法加密并发送到客户端; 

m、握手结束 

客户端计算所有接收信息的 hash 值,并采用协商密钥解密 verify_data_S,验证服务器发送的数据和密钥,验证通过则握手完成;

n、 加密通信

开始使用协商密钥与算法进行加密通信。

2、密钥交换和签名算法 

常用的密钥交换和签名算法

HTTPS 通过 TLS 层和证书机制提供了内容加密、身份认证和数据完整性三大功能。加密过程中,需要用到非对称密钥交换和对称内容加密两大算法。

对称内容加密强度非常高,加解密速度也很快,只是无法安全地生成和保管密钥。在 TLS 协议中,最后的应用数据都是经过对称加密后传输的,传输中所使用的对称协商密钥(上文中的 enc_key),则是在握手阶段通过非对称密钥交换而来。常见的 AES-GCM、ChaCha20-Poly1305,都是对称加密算法。

非对称密钥交换能在不安全的数据通道中,产生只有通信双方才知道的对称加密密钥。目前最常用的密钥交换算法有 RSA 和 ECDHE。

RSA 历史悠久,支持度好,但不支持完美前向安全 - PFS(Perfect Forward Secrecy);而 ECDHE 是使用了 ECC(椭圆曲线)的 DH(Diffie-Hellman)算法,计算速度快,且支持 PFS。

PKI 体系 节中说明了仅有非对称密钥交换还是无法抵御 MITM 攻击的,所以需要引入了 PKI 体系的证书来进行身份验证,其中服务端非对称加密产生的公钥会放在证书中传给客户端

在 RSA 密钥交换中,浏览器使用证书提供的 RSA 公钥加密相关信息,如果服务端能解密,意味着服务端拥有与公钥对应的私钥,同时也能算出对称加密所需密钥。密钥交换和服务端认证合并在一起。

在 ECDH 密钥交换中,服务端使用私钥 (RSA 或 ECDSA) 对相关信息进行签名,如果浏览器能用证书公钥验证签名,就说明服务端确实拥有对应私钥,从而完成了服务端认证。密钥交换则是各自发送 DH 参数完成的,密钥交换和服务端认证是完全分开的。

可用于 ECDHE 数字签名的算法主要有 RSA ECDSA - 椭圆曲线数字签名算法​,也就是目前密钥交换 + 签名有三种主流选择:

  • RSA - RSA 密钥交换(无需签名)
  • ECDHE_RSA - ECDHE 密钥交换、RSA 签名
  • ECDHE_ECDSA - ECDHE 密钥交换、ECDSA 签名

比如我的网站使用的加密套件是 ECDHE_RSA,可以看到数字签名算法是 sha256 哈希加 RSA 加密,在 PKI 体系 一节中讲了签名是服务器信息摘要的哈希值加密生成的。

内置 ECDSA 公钥的证书一般被称之为 ECC 证书,内置 RSA 公钥的证书就是 RSA 证书。因为 256 位 ECC Key 在安全性上等同于 3072 位 RSA Key,所以 ECC 证书体积比 RSA 证书小,而且 ECC 运算速度更快,ECDHE 密钥交换 + ECDSA 数字签名是目前最好的加密套件。

RSA 密钥交换和 DH 密钥交换的区别

使用 RSA 进行密钥交换的握手过程与前面说明的基本一致,只是没有 ServerKeyExchange 消息,其中协商密钥涉及到三个参数 (客户端随机数 random_C、服务端随机数 random_S、预主密钥 Premaster secret), 其中前两个随机数和协商使用的算法是明文的很容易获取,最后一个 Premaster secret 会用服务器提供的公钥加密后传输给服务器 (密钥交换),如果这个预主密钥被截取并破解则协商密钥也可以被破解。

RSA 的算法核心思想:是利用了极大整数 因数分解 的计算复杂性。

而使用 DH(Diffie-Hellman) 算法 进行密钥交换,双方只要交换各自的 DH 参数(在 ServerKeyExchange 发送 Server params,在 ClientKeyExchange 发送 Client params),不需要传递 Premaster secret,就可以各自算出这个预主密钥。

DH 的握手过程如下,大致过程与 RSA 类似,图中只表达如何生成预主密钥:

 

 

服务器通过私钥将客户端随机数 random_C,服务端随机数 random_S,服务端 DH 参数 Server params 签名生成 signature,然后在 ServerKeyExchange 消息中发送服务端 DH 参数和该签名;

客户端收到后用服务器给的公钥解密验证签名,并在 ClientKeyExchange 消息中发送客户端 DH 参数 Client params;

服务端收到后,双方都有这两个参数,再各自使用这两个参数生成预主密钥 Premaster secret,之后的协商密钥等步骤与 RSA 基本一致。

基于 RSA 算法与 DH 算法的握手最大的区别就在于密钥交换与身份认证。前者客户端使用公钥加密预主密钥并发送给服务端完成密钥交换,服务端利用私钥解密完成身份认证。后者利用各自发送的 DH 参数完成密钥交换,服务器私钥签名数据,客户端公钥验签完成身份认证。

​其核心思想是利用了 离散对数问题 的计算复杂性

原根:假设一个整数 g 对于质数 P 来说是原根,那么 g^i mod P (1 ≦ i < P) 的结果各不相同,且其结果按一定顺序排列后是 1 到 P-1 的所有整数

离散对数:如果对于一个整数 n 和质数 P 的一个原根 g,可以找到一个唯一的指数 i,使得 n = g^i mod P (0 ≦ i < P),那么指数 i 称为 n 的以 g 为基数的模 P 的离散对数 

Diffie-Hellman 算法的有效性依赖于计算离散对数的难度,其含义是:当已知大素数 P 和它的一个原根 g 后,对给定的 n,要计算 i,被认为是很困难的,而给定 i 计算 n 却相对容易 

算法过程可以抽象成下图:

 

双方预先商定好了一对 P g 值 (公开的),而 Alice 有一个私密数 a(非公开,对应一个私钥),Bob 有一个私密数 b(非公开,对应一个私钥)

  • Alice 计算 A = g^a mod P,并把 A(公开,对应一个公钥) 发给 Bob

  • Bob 计算 B = g^b mod P,并把 B(公开,对应一个公钥) 发给 Alice

  • 双方计算出共享密钥,K = B^a mod P = A^b mod P (= g^ab mod P)

对于 Alice 和 Bob 来说通过对方发过来的公钥参数和自己手中的私钥可以得到最终相同的密钥

而第三方最多知道 P g A B,想得到私钥和最后的密钥很困难,当然前提是 a b P 足够大 (RFC3526 文档中有几个常用的大素数可供使用),否则暴力破解也有可能试出答案,至于 g 一般取个较小值就可以

如下几张图是实际 DH 握手发送的内容:

 

 

 可以看到双方发给对方的参数中携带了一个公钥值,对应上述的 A 和 B

而且实际用的加密套件是椭圆曲线 DH 密钥交换 (ECDH),利用由椭圆曲线加密建立公钥与私钥对可以更进一步加强 DH 的安全性,因为目前解决椭圆曲线离散对数问题要比因式分解困难的多,而且 ECC 使用的密钥长度比 RSA 密钥短得多(目前 RSA 密钥需要 2048 位以上才能保证安全,而 ECC 密钥 256 位就足够)


3、客户端身份验证

尽管可以选择对任意一端进行身份验证,但人们几乎都启用了对服务器的身份验证。如果服务器选择的套件不是匿名的,那么就需要在 Certificate 消息中跟上自己的证书。

相比之下,服务器通过发送 CertificateRequest 消息请求对客户端进行身份验证。消息中列出所有可接受的客户端证书。作为响应,客户端发送自己的 Certificate 消息(使用与服务器发送证书相同的格式),并附上证书。此后,客户端发送 CertificateVerify 消息,证明自己拥有对应的私钥。

只有已经过身份验证的服务器才被允许请求客户端身份验证。基于这个原因,这个选项也被称为相互身份验证(mutual authentication)。

a、CertificateRequest

在 ServerHello 的过程中发出,请求对客户端进行身份验证,并将其接受的证书的公钥和签名算法传送给客户端。

它也可以选择发送一份自己接受的证书颁发机构列表,这些机构都用其可分辨名称来表示:

struct {
  ClientCertificateType certificate_types;
  SignatureAndHashAlgorithm supported_signature_algorithms;
  DistinguishedName certificate_authorities;
} CertificateRequest;

b、CertificateVerify

在 ClientKeyExchange 的过程中发出,证明自己拥有的私钥与之前发送的客户端证书中的公钥匹配。消息中包含一条到这一步为止的所有握手消息的签名:

struct {
  Signature handshake_messages_signature;
} CertificateVerify;

4、会话恢复

最初的会话恢复机制是,在一次完整协商的连接断开时,客户端和服务器都会将会话的安全参数保存一段时间。希望使用会话恢复的服务器为会话指定唯一的标识,称为会话 ID(Session ID)。服务器在 ServerHello 消息中将会话 ID 发回客户端。

希望恢复早先会话的客户端将适当的 Session ID 放入 ClientHello 消息,然后提交。服务器如果同意恢复会话,就将相同的 Session ID 放入 ServerHello 消息返回,接着使用之前协商的主密钥生成一套新的密钥,再切换到加密模式,发送 Finished 消息。 客户端收到会话已恢复的消息以后,也进行相同的操作。这样的结果是握手只需要一次网络往返。

Session ID 由服务器端支持,协议中的标准字段,因此基本所有服务器都支持,服务器端保存会话 ID 以及协商的通信信息,占用服务器资源较多。

 用来替代服务器会话缓存和恢复的方案是使用会话票证(Session ticket)。使用这种方式,除了所有的状态都保存在客户端(与 HTTP Cookie 的原理类似)之外,其消息流与服务器会话缓存是一样的。

其思想是服务器取出它的所有会话数据(状态)并进行加密 (密钥只有服务器知道),再以票证的方式发回客户端。在接下来的连接中,客户端恢复会话时在 ClientHello 的扩展字段 session_ticket 中携带加密信息将票证提交回服务器,由服务器检查票证的完整性,解密其内容,再使用其中的信息恢复会话。

这种方法有可能使扩展服务器集群更为简单,因为如果不使用这种方式,就需要在服务集群的各个节点之间同步会话。 Session ticket 需要服务器和客户端都支持,属于一个扩展字段,占用服务器资源很少。

警告:会话票证破坏了 TLS 安全模型。它使用票证密钥加密的会话状态并将其暴露在线路上。有些实现中的票证密钥可能会比连接使用的密码要弱。如果票证密钥被暴露,就可以解密连接上的全部数据。因此,使用会话票证时,票证密钥需要频繁轮换。

TLS详解
marylgao技术专栏
04-02 9448
TLS全称是Transport Layer Security,是用来替代SSL的,是一种密码协议,用来提供计算机之间交互的安全通信。主要用于https通信,也用于email,即使通信等。 TLS握手 TLS握手通常分为2种方式,一种是基本的握手(具体可参照下图),另一种是客户端服务端握手(因为这种用的少,就不细讲) 通过上图可知,我们这里说的TLS握手主要讲的是最基本的TLS握手,即只使用服务器的证书来进行加密,具体步骤如下: 1.客户端与服务器之间通过3次握手建立连接 2.协商阶段 a. client发
【云安全】传输层安全性(TLS)大汇总
qq_43543209的博客
02-11 1485
传输层安全性(Transport Layer Security,TLS)是一种广泛采用的安全性协议,旨在促进互联网通信的私密性和数据安全性。TLS 的主要用例是对 web 应用程序和服务器之间的通信(例如,web 浏览器加载网站)进行加密。TLS 由互联网工程任务组(Internet Engineering Task Force, IETF)提出,协议的第一个版本于 1999 年发布。最新版本是 TLS 1.3,发布于 2018 年。Cloudflare 向所有用户提供免费的 TLS/SSL 证书。
传输层安全(TLS)笔记
weixin_43586667的博客
02-05 1万+
一.什么是TLS TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。 ...
(记得关注哦)对传输层安全 TLS(Transport Layer Security)协议最新版进行分析。
最新发布
qq_63117516的博客
07-01 647
换、DH(Diffie-Hellman)密钥交换或 ECDH(Elliptic Curve Diffie-Hellman)密钥交换等方。3、ECDH(Elliptic Curve Diffie-Hellman)密钥交换:与 DH 密钥交换类似,但使用的是椭圆。1、进入 openssl 的官网未提供 openssl 的安装包,我选择了其他的网站,直接安装 openssl 的。加密标准)、DES(数据加密标准)和 3DES(Triple DES)等。在 TLS 中,AES 是最常用的对称加。
TLS简单介绍
fitpolo
04-21 3361
TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。一段信息,经过摘要算法得到一串哈希值,就是摘要(dijest)。常见的摘要算法有MD5、SHA1、SHA256、SHA512等。关于摘要,有几点需要你明白的:(a)摘要算法,是把任意长度的信息,映射成一个定长的字符串。
TLS协议详解,一文带你了解TLS协议
weixin_74021557的博客
06-18 1万+
本文介绍了TLS的概论、工作原理、发展历史、算法和参考资料。TLS是一种加密协议,用于保护网络通信的安全性和隐私性。它使用公钥加密和对称密钥加密两种加密方式来保护通信的安全性,可以防止黑客窃取用户的敏感信息。TLS的发展历史可以追溯到SSL 1.0,但由于存在安全漏洞而被废弃。TLS 1.0、TLS 1.1和TLS 1.2分别于1999年、2006年和2008年发布,进一步增强了安全性和性能。常用的加密算法包括AES、RSA、MD5等。
SSL/TLS详解
无线网络系统研究
04-12 5220
TLSSSL,安全,key_share
TLS/SSL 详解
zhuguanlin121的博客
10-13 4947
基础入门 HTTPS 对称加密 非对称加密 证书 TLS握手过程 握手总结 TLS 定义 HTTPS = HTTP over TLS. 加密 记录层 分片 (Fragmentation) 记录压缩和解压缩 (Record compression and decompression) 空或标准流加密 (Null or standard stream cipher) CBC 块加密 (分组加密) 记录有效载荷保护 (Record payload protection) 密钥计算 (Key calculation
通讯加密证书 TLS详解.pdf
11-14
### 通讯加密证书 TLS详解 #### 一、什么是TLS TLS(Transport Layer Security)即传输层安全性协议,是一种广泛应用于互联网安全通信的标准协议。它的前身是SSL(Secure Sockets Layer)。TLS采用C/S架构(客户端...
详解TLS SSL技术.docx
10-30
【传输层安全性(TLS)与安全套接字层(SSL)技术详解】 传输层安全性(TLS)和安全套接字层(SSL)是网络安全领域中用于保护数据传输的关键协议,尤其是当数据需穿越不受信任的网络时。这两个协议通过基于证书的...
SSL&TLS 协议详解
07-25
SSL/TLS协议详解 SSL(Secure Sockets Layer)和TLS(Transport Layer Security)协议是互联网上广泛采用的安全协议,主要用于在网络通信中确保数据的安全性和完整性。它们主要在TCP/IP协议之上,为上层应用提供...
TLSSSL协议详解
06-25
### TLSSSL协议详解 #### 一、SSL与HTTPS的关系 许多人经常将SSL与HTTPS混淆,认为两者等同。实际上,SSL(Secure Socket Layer,安全套接层)是一种通用的安全协议,其主要职责在于保障数据传输的安全性,而不...
如何让Nginx快速支持TLS1.3协议详解
09-30
【如何让Nginx快速支持TLS1.3协议详解】 Nginx 是一款广泛应用的高性能Web服务器和反向代理服务器,其对TLS(Transport Layer Security)协议的支持是保证网络安全的重要一环。TLS 1.3是最新且最安全的TLS协议版本...
SSL/TLS介绍
liitdar的博客
06-19 2000
SSL及其继任者TLS是为网络通信提供安全及数据完整性的一种安全协议。SSL由Netscape研发,用以保障在Internet上安全地进行数据传输,利用数据加密“Encryption”技术,可确保数据在网络传输过程中不会被截取或窃听。SSL的当前版本为3.0,它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输场景中。TLS用于在两个通信应用程序之间提供保密性和数据完整性。SSLTLS都是在传输层上对网络连接进行加密的。
传输层的安全协议——SSL/TLS,及HTTPS的工作原理
Neonline254的博客
11-09 8467
SSL/TLS协议是当今最流行的Web安全协议,它实现了两个应用进程之间的安全传输。 本文较为详细地介绍了TLS和HTTPS的工作原理,并简单介绍了其中涉及的计算机网络和密码学知识。
TLS原理及实现
走在成长的路上
05-28 3195
概念 对称密钥 既可以加密也可以解密的密钥 非对称密钥 密钥分为公钥和私钥两部分,公钥用于加密和验证签名,私钥用于解密和签名 证书 可理解为身份证,证书由证书机构颁发(可信第三方),证书中包括证书所有者的相关属性信息,并且证书可由证书机构的公钥进行验证,杜绝身份伪造。 证书链 由根证书衍生而来,例如根证书R给A颁发证书,A给B颁发证书,B给C颁发证书,最终R->A->B->C形成一条证书链。证书链确保了次级证书的合法性,并允许验证,验证的过程是逆向的C->B->A
学习笔记|一篇文章带你全面了解TLS 协议的全流程
Jum的博客
06-29 4015
TLS(英语:Transport Layer Security,缩写作TLS)传输层安全性协议,及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与RFC 6176(2011年3月)
TLS协议详解
热门推荐
weixin_46622350的博客
10-17 2万+
TLS简介 SSL 即安全套接字层,它在 OSI 七层网络模型中处于第五层,SSL 在 1999 年被 IETF(互联网工程组)更名为 TLS ,即传输安全层,直到现在,TLS 一共出现过三个版本,1.1、1.2 和 1.3 ,目前最广泛使用的是 1.2,所以接下来的探讨都是基于 TLS 1.2 的版本上的。 TLS1.2 和 TLS 1.3 的区别 在 TLS 1.2 的握手中,一般是需要 4 次握手,先要通过 Client Hello (第 1 次握手)和 Server Hello(第 2 次握手) 消
https启用tls1.2
07-28
要启用TLS 1.2协议,您可以按照以下步骤进行操作: 1. 打开注册表编辑器,可以通过运行命令regedit来打开。 2. 导航到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols路径。 3. 在Protocols下右键,选择新建,然后选择项,创建一个名为TLS 1.2的新项。 4. 在TLS 1.2下右键,选择新建,然后选择项,创建一个名为Server的新项。 5. 在Server下右键,选择新建,然后选择DWORD值,创建一个名为Enabled的新DWORD值。 6. 双击Enabled,将数值数据设置为1,表示启用TLS 1.2协议。 7. 同样,在TLS 1.2下右键,选择新建,然后选择项,创建一个名为Client的新项。 8. 在Client下右键,选择新建,然后选择DWORD值,创建一个名为Enabled的新DWORD值。 9. 双击Enabled,将数值数据设置为1,表示启用TLS 1.2协议。 10. 完成后,关闭注册表编辑器。 通过以上步骤,您已经成功启用了TLS 1.2协议。请注意,这些步骤是为了在Windows操作系统中启用TLS 1.2协议。\[1\]同时,启用TLS 1.2协议可以提高安全性,因为它使用了ECDHE来增强随机性,并且具有前向安全性。与RSA相比,ECDHE在服务器密钥泄露的情况下更加安全,因为之前的连接对应密钥无法被解密,从而保护了数据的安全性。此外,进行Finished校验也是非常必要的,以防止传输过程中的篡改。\[2\]\[3\] #### 引用[.reference_title] - *1* [windows server 2008 r2 中IIS启用TLS 1.2(安装SSL后用TLS 1.2)](https://blog.csdn.net/weixin_32210881/article/details/119262828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [HTTPS之TLS1.2连接详解](https://blog.csdn.net/qq_40276626/article/details/120396330)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
写文章

热门文章

  • TLS 详解 24321
  • 清理linux系统内存缓存 24217
  • Linux设置yum源为阿里云镜像源 19351
  • Apache License 2.0 14163
  • Nginx proxy_set_header参数设置 13034

分类专栏

  • Network 36篇
  • 中间件 58篇
  • 存储 11篇
  • K8S 70篇
  • 软件工程 2篇
  • 工商管理 14篇
  • 协议 4篇
  • 数据库 55篇
  • 分布式 67篇
  • 云原生 51篇
  • 计算机 6篇
  • 技术# 架构 13篇
  • 金融 19篇
  • 工商管理# 政治 2篇
  • 技术# 服务器 8篇
  • 工商管理# 股权结构设计 4篇
  • 工商管理# 博弈论 1篇
  • 工商管理# 公司法 3篇
  • 工商管理# 绩效与薪酬管理实务 3篇
  • 工商管理# 战略分析
  • 企业架构 8篇
  • 人工智能 14篇
  • 算法 11篇
  • 芯片 3篇
  • 技术 1篇
  • 工商管理# 法律 2篇
  • 工商管理# 营销 1篇
  • 工商管理# 案例分析 2篇
  • 工商管理# 税务 1篇
  • 工商管理# 数据、模型和决策
  • 互联网 1篇
  • 产品 3篇
  • Linux 36篇
  • 监控 22篇
  • 技术# Java Core 55篇
  • 大数据 12篇
  • 战略 7篇
  • 云计算 19篇
  • 战略# 屈臣氏集团 4篇
  • 操作系统 15篇
  • 考试 2篇
  • 管理 26篇
  • 多线程 15篇
  • English 7篇
  • 组织/机构 1篇
  • Coding 2篇
  • Spring 18篇
  • Web 6篇
  • MQ 13篇
  • IT 7篇

最新评论

  • SkyWalking监控视角与指标介绍

    summer_west_fish: 我们现在使用OpenTelemetry and Jaeger去做trace,这是一个开放的标准。 后面还会使用商业组件Dynatrace,trace的能力更好

  • Linux设置yum源为阿里云镜像源

    天一终成码农: 第一步就找不到说是未知的名称或者服务..

  • SkyWalking监控视角与指标介绍

    lbingk: 使用普罗米修斯很大问题在于需要修改pml可能还需要修改代码,做不了插桩的

  • Linux设置yum源为阿里云镜像源

    fangfuzha: 清晰的过程

  • 算法的四大思想之一:贪心思想

    summer_west_fish: 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法并不总是产生最优解,但在很多问题上,它确实能给出很好的近似解,并且它的实现通常很简单。

最新文章

  • TCP 已经实现 KeepAlive,为什么应用层还要实现一遍?
  • Minio使用指南
  • WRK 压测工具使用
2024
08月 2篇
07月 3篇
06月 1篇
05月 11篇
04月 6篇
03月 25篇
02月 16篇
01月 18篇
2023年244篇
2022年115篇
2021年106篇
2020年50篇
2018年1篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码横岗网站优化排名福永百度网站优化深圳模板网站建设大运高端网站设计西乡百度竞价龙岗seo布吉网站建设设计坂田企业网站改版平湖外贸网站制作福永网站制作坪地关键词按天收费塘坑网站seo优化大浪企业网站改版龙华企业网站建设福田设计公司网站布吉百度标王大运设计网站木棉湾设计公司网站坪山网站优化大运阿里店铺运营大运建站罗湖百度竞价包年推广平湖网站建设设计西乡seo排名永湖关键词按天计费惠州网站优化按天计费横岗企业网站建设坪山网页设计沙井seo优化南山营销网站歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化