【学习】HTTPS协议详解与安全机制实践

在当今数字化时代,网络安全已成为互联网应用的基石。HTTPS(HyperText Transfer Protocol Secure)作为现代Web通信的安全标准,保护着我们日常的网络交互免受窃听、篡改和伪造攻击。本文将深入探讨HTTPS协议的技术原理、实现机制和最佳实践。

一、HTTPS协议概述

(一)什么是HTTPS

HTTPS协议(HyperText Transfer Protocol over Secure Socket Layer)可以理解为HTTP+SSL/TLS,即在HTTP协议下加入SSL层。2 HTTPS的安全基础是SSL/TLS,因此加密的详细内容需要依赖SSL/TLS协议来实现安全的HTTP数据传输。

HTTPS的核心特性

  • 机密性:通过加密算法保护数据传输过程中不被窃听
  • 完整性:确保数据在传输过程中未被篡改
  • 身份认证:验证通信双方的身份,防止中间人攻击
  • 不可否认性:通过数字签名确保数据来源的可靠性

(二)HTTP与HTTPS的区别

特性 HTTP HTTPS
安全性 明文传输,不安全 加密传输,安全
端口 80 443
证书 不需要 需要SSL证书
加密 无加密 SSL/TLS加密
SEO 搜索引擎不优先 搜索引擎优先收录
性能 较快 略慢(加密开销)

(三)SSL/TLS协议发展历史

TLS(Transport Layer Security,传输层安全)协议的前身是SSL协议。2 它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从3.1开始被IETF标准化并改名为TLS。

版本演进

  • SSL 1.0:从未公开发布(存在严重安全漏洞)
  • SSL 2.0:1995年发布,存在多个安全问题
  • SSL 3.0:1996年发布,修复了SSL 2.0的问题
  • TLS 1.0:1999年发布,基于SSL 3.0改进
  • TLS 1.1:2006年发布,修复了TLS 1.0的漏洞
  • TLS 1.2:2008年发布,目前使用最广泛的版本
  • TLS 1.3:2018年发布,大幅提升安全性和性能

二、SSL/TLS协议架构

(一)协议层次结构

SSL/TLS协议采用分层设计,主要包含以下几个子协议:

应用层协议 (HTTP, FTP, SMTP等)
    |
+---+---+---+---+---+
| 握手协议 | 密码变更协议 | 警告协议 | 应用数据协议 |
+---+---+---+---+---+
    |
记录层协议 (Record Protocol)
    |
传输层协议 (TCP)

各层协议功能

  1. 记录层协议:负责数据的分段、压缩、加密和完整性保护
  2. 握手协议:负责身份认证和密钥协商
  3. 密码变更协议:通知对方改变加密规格
  4. 警告协议:传递警告和错误信息

(二)加密算法体系

SSL/TLS协议使用多种加密算法来保证通信安全:

1. 对称加密算法

  • AES(Advanced Encryption Standard):目前最常用的对称加密算法
  • ChaCha20:Google开发的流加密算法
  • 3DES:较老的加密算法,逐渐被淘汰

2. 非对称加密算法

  • RSA:最广泛使用的公钥加密算法
  • ECDSA:椭圆曲线数字签名算法
  • DH/ECDH:密钥交换算法

3. 哈希算法

  • SHA-256:安全哈希算法
  • SHA-384/SHA-512:更高安全级别的哈希算法

三、TLS握手过程详解

(一)TLS 1.2握手流程

TLS握手是建立安全连接的关键过程,涉及多个步骤的密钥协商和身份验证:

客户端                                服务端
   |                                     |
   |  1. Client Hello                   |
   |------------------------------------>|
   |                                     |
   |  2. Server Hello                   |
   |  3. Certificate                    |
   |  4. Server Key Exchange (可选)     |
   |  5. Server Hello Done              |
   |<------------------------------------|
   |                                     |
   |  6. Client Key Exchange            |
   |  7. Change Cipher Spec             |
   |  8. Finished                       |
   |------------------------------------>|
   |                                     |
   |  9. Change Cipher Spec             |
   |  10. Finished                      |
   |<------------------------------------|
   |                                     |
   |  应用数据传输                        |
   |<===================================>|

详细步骤说明

1. Client Hello
客户端发送支持的TLS版本、加密套件列表、压缩方法和客户端随机数。

{
  "version": "TLS 1.2",
  "random": "client_random_32_bytes",
  "cipher_suites": [
    "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
    "TLS_RSA_WITH_AES_128_CBC_SHA256"
  ],
  "compression_methods": ["null"],
  "extensions": {
    "server_name": "example.com",
    "supported_groups": ["secp256r1", "secp384r1"]
  }
}

2. Server Hello
服务端选择TLS版本、加密套件、压缩方法,并发送服务端随机数。

3. Certificate
服务端发送数字证书链,包含服务端的公钥。1 消息包含一个X.509证书,证书中包含公钥,发给客户端用来验证签名或在密钥交换时给消息加密。

4. Server Key Exchange(可选)
当使用DHE或ECDHE等前向安全算法时,服务端发送密钥交换参数。3 对于DHE开头的协商算法,Server需要发给Client动态的DH参数ServerDHParams和数字签名。

5-8. 密钥交换和验证
客户端验证证书,生成预主密钥,发送给服务端,双方计算会话密钥。

9-10. 握手完成
双方发送Finished消息,确认握手成功,开始加密通信。

(二)TLS 1.3握手优化

TLS 1.3在TLS 1.2的基础上进行了重大改进,主要体现在速度和安全性的提升:

客户端                                服务端
   |                                     |
   |  Client Hello                      |
   |  + Key Share                       |
   |------------------------------------>|
   |                                     |
   |  Server Hello                      |
   |  + Key Share                       |
   |  {EncryptedExtensions}             |
   |  {Certificate}                     |
   |  {CertificateVerify}               |
   |  {Finished}                        |
   |<------------------------------------|
   |                                     |
   |  {Finished}                        |
   |------------------------------------>|
   |                                     |
   |  应用数据传输                        |
   |<===================================>|

TLS 1.3的主要改进

  1. 减少握手往返:从2-RTT减少到1-RTT
  2. 移除不安全算法:禁用RSA密钥交换、静态DH等
  3. 强制前向安全:所有密钥交换都使用临时密钥
  4. 简化加密套件:移除冗余的加密组合

四、数字证书体系

(一)数字证书的作用

数字证书的作用是用来认证公钥持有者的身份,以防止第三方进行冒充。1 简单来说,证书就是用来告诉客户端,该服务端是否是合法的,因为只有证书合法,才代表服务端身份是可信的。

证书的核心功能

  • 身份验证:确认服务器的真实身份
  • 公钥分发:安全地传递服务器的公钥
  • 防止中间人攻击:通过CA签名验证证书真实性

(二)证书颁发机构(CA)

为了让服务端的公钥被大家信任,服务端的证书都是由CA(Certificate Authority 证书认证机构)签名的。1 CA就是网络世界里的公安局、公证中心,具有极高的可信度,所以由它来给各个公钥签名。

主要CA机构

  • DigiCert:全球领先的CA机构
  • Let’s Encrypt:免费的自动化CA
  • GlobalSign:老牌CA机构
  • Comodo/Sectigo:性价比较高的CA

(三)证书类型和验证级别

按验证级别分类

  1. DV证书(Domain Validation)

    • 只验证域名所有权
    • 申请简单,价格便宜
    • 适合个人网站和博客
  2. OV证书(Organization Validation)

    • 验证域名和组织信息
    • 提供更高的信任级别
    • 适合企业网站
  3. EV证书(Extended Validation)

    • 最严格的验证流程
    • 浏览器地址栏显示绿色
    • 适合金融、电商等高安全要求网站

按覆盖范围分类

# 单域名证书
example.com

# 通配符证书
*.example.com
# 覆盖:www.example.com, api.example.com, blog.example.com

# 多域名证书(SAN)
example.com
www.example.com
api.example.com
other-domain.com

(四)证书链验证过程

证书链验证是确保证书可信的关键过程:

根证书 (Root CA)
    |
    v
中间证书 (Intermediate CA)
    |
    v
服务器证书 (End Entity Certificate)

验证步骤

  1. 检查证书有效期:确认证书未过期
  2. 验证证书链:从服务器证书到根证书的完整链路
  3. 检查撤销状态:通过CRL或OCSP检查证书是否被撤销
  4. 域名匹配:确认证书中的域名与访问的域名一致
  5. 签名验证:验证每级证书的数字签名

五、加密机制详解

(一)对称加密与非对称加密

HTTPS使用混合加密体系,结合了对称加密和非对称加密的优势:

非对称加密在握手过程中的应用1

  • 在握手过程中使用公钥和私钥对来安全地交换信息
  • 客户端使用服务器的公钥加密预主密钥
  • 服务器使用其私钥解密

对称加密在数据传输中的应用1

  • 握手完成后,双方使用单个会话密钥实现更快、更高效的加密
  • 在握手期间共享会话密钥
# 伪代码示例:混合加密过程
def https_encryption_process():
    # 1. 非对称加密阶段(握手)
    server_public_key = get_server_certificate().public_key
    pre_master_secret = generate_random_key()
    encrypted_pms = rsa_encrypt(pre_master_secret, server_public_key)
    
    # 2. 密钥派生
    master_secret = derive_master_secret(pre_master_secret, 
                                       client_random, 
                                       server_random)
    session_keys = derive_session_keys(master_secret)
    
    # 3. 对称加密阶段(数据传输)
    encrypted_data = aes_encrypt(application_data, session_keys.encryption_key)
    mac = hmac_sha256(encrypted_data, session_keys.mac_key)
    
    return encrypted_data + mac

(二)密钥交换算法

RSA密钥交换

客户端生成预主密钥 → 用服务器公钥加密 → 发送给服务器
服务器用私钥解密 → 获得预主密钥 → 双方计算会话密钥

DHE/ECDHE密钥交换(前向安全)

服务器生成临时密钥对 → 发送公钥给客户端
客户端生成临时密钥对 → 发送公钥给服务器
双方使用DH算法计算共享密钥 → 派生会话密钥

前向安全的重要性

  • 即使服务器私钥泄露,历史通信数据仍然安全
  • 每次会话使用不同的临时密钥
  • TLS 1.3强制要求前向安全

(三)数字签名机制

数字签名用于确保数据发送者的合法身份和数据完整性:4

数字签名生成过程

def generate_digital_signature(message, private_key):
    # 1. 计算消息哈希
    message_hash = sha256(message)
    
    # 2. 用私钥对哈希值签名
    signature = rsa_sign(message_hash, private_key)
    
    return signature

def verify_digital_signature(message, signature, public_key):
    # 1. 计算消息哈希
    message_hash = sha256(message)
    
    # 2. 用公钥验证签名
    decrypted_hash = rsa_verify(signature, public_key)
    
    # 3. 比较哈希值
    return message_hash == decrypted_hash

六、HTTPS性能优化

(一)握手优化技术

1. Session Resumption(会话恢复)

# 会话ID方式
客户端保存:session_id
服务端保存:session_id -> session_data

# Session Ticket方式
服务端加密会话数据 → 发送给客户端保存
客户端下次连接时提交ticket → 服务端解密恢复会话

2. OCSP Stapling

传统方式:客户端 → OCSP服务器查询证书状态
OCSP Stapling:服务端预先获取OCSP响应 → 在握手时一并发送

3. HTTP/2和HTTP/3

  • HTTP/2:多路复用、服务器推送、头部压缩
  • HTTP/3:基于QUIC协议,减少连接建立时间

(二)证书优化

1. 证书链优化

# 优化前:完整证书链
Root CA (2048 bit) → Intermediate CA (2048 bit) → Server Cert (2048 bit)

# 优化后:使用ECC证书
Root CA (256 bit ECC) → Server Cert (256 bit ECC)

2. 证书预加载

<!-- DNS预解析 -->
<link rel="dns-prefetch" href="//cdn.example.com">

<!-- 预连接 -->
<link rel="preconnect" href="https://api.example.com">

<!-- 预加载关键资源 -->
<link rel="preload" href="/critical.css" as="style">

(三)服务器配置优化

Nginx HTTPS优化配置

server {
    listen 443 ssl http2;
    server_name example.com;
    
    # SSL证书配置
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/private.key;
    
    # SSL协议和加密套件
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # 性能优化
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets on;
    
    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /path/to/chain.pem;
    
    # 安全头部
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    
    location / {
        # 应用配置
    }
}

七、HTTPS安全最佳实践

(一)证书管理最佳实践

1. 证书选择原则

# 个人博客/小型网站
Let's Encrypt DV证书(免费)

# 企业网站
商业OV证书

# 金融/电商网站
EV证书 + 多域名支持

2. 证书自动化管理

# 使用Certbot自动续期Let's Encrypt证书
#!/bin/bash
# 安装certbot
sudo apt-get install certbot python3-certbot-nginx

# 获取证书
sudo certbot --nginx -d example.com -d www.example.com

# 设置自动续期
echo "0 12 * * * /usr/bin/certbot renew --quiet" | sudo crontab -

3. 证书监控

# Python证书过期监控脚本
import ssl
import socket
from datetime import datetime, timedelta

def check_certificate_expiry(hostname, port=443):
    context = ssl.create_default_context()
    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            cert = ssock.getpeercert()
            
    # 解析过期时间
    expire_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
    days_left = (expire_date - datetime.now()).days
    
    if days_left < 30:
        print(f"警告:{hostname} 证书将在 {days_left} 天后过期")
    
    return days_left

# 使用示例
check_certificate_expiry('example.com')

(二)安全配置检查

1. SSL Labs测试

# 使用SSL Labs API检查网站安全性
curl -s "https://api.ssllabs.com/api/v3/analyze?host=example.com" | jq '.grade'

2. 安全头部配置

# 强制HTTPS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

# 防止点击劫持
X-Frame-Options: DENY

# 内容类型嗅探保护
X-Content-Type-Options: nosniff

# XSS保护
X-XSS-Protection: 1; mode=block

# 内容安全策略
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'

3. 证书透明度监控

# 监控证书透明度日志
curl -s "https://crt.sh/?q=example.com&output=json" | jq '.[].name_value'

(三)常见安全问题防护

1. 中间人攻击防护

# Python客户端证书验证
import requests
import ssl

# 启用证书验证
response = requests.get('https://example.com', verify=True)

# 证书固定(Certificate Pinning)
import hashlib

def verify_certificate_pin(cert_der, expected_pin):
    cert_sha256 = hashlib.sha256(cert_der).hexdigest()
    return cert_sha256 == expected_pin

2. 降级攻击防护

# Nginx配置:禁用不安全的协议版本
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

3. 会话劫持防护

// 设置安全的Cookie
document.cookie = "sessionid=abc123; Secure; HttpOnly; SameSite=Strict";

// 检查连接安全性
if (location.protocol !== 'https:') {
    location.replace('https:' + window.location.href.substring(window.location.protocol.length));
}

八、HTTPS部署实战

(一)Apache HTTPS配置

# /etc/apache2/sites-available/example-ssl.conf
<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/html
    
    # SSL引擎
    SSLEngine on
    
    # 证书文件
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/intermediate.crt
    
    # SSL协议配置
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder off
    
    # HSTS头部
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>

# HTTP重定向到HTTPS
<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

(二)Node.js HTTPS服务器

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

// HTTPS服务器配置
const options = {
    key: fs.readFileSync('/path/to/private.key'),
    cert: fs.readFileSync('/path/to/certificate.crt'),
    ca: fs.readFileSync('/path/to/ca-bundle.crt')
};

// 中间件:强制HTTPS
app.use((req, res, next) => {
    if (req.header('x-forwarded-proto') !== 'https') {
        res.redirect(`https://${req.header('host')}${req.url}`);
    } else {
        next();
    }
});

// 安全头部中间件
app.use((req, res, next) => {
    res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
    res.setHeader('X-Frame-Options', 'DENY');
    res.setHeader('X-Content-Type-Options', 'nosniff');
    next();
});

// 路由
app.get('/', (req, res) => {
    res.send('Hello HTTPS World!');
});

// 启动HTTPS服务器
https.createServer(options, app).listen(443, () => {
    console.log('HTTPS服务器运行在端口443');
});

// HTTP重定向服务器
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(301, { Location: `https://${req.headers.host}${req.url}` });
    res.end();
}).listen(80);

(三)Docker容器化HTTPS部署

# Dockerfile
FROM nginx:alpine

# 复制配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY ssl/ /etc/nginx/ssl/

# 复制网站文件
COPY dist/ /usr/share/nginx/html/

# 暴露端口
EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]
# docker-compose.yml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./ssl:/etc/nginx/ssl:ro
      - ./logs:/var/log/nginx
    environment:
      - NGINX_HOST=example.com
    restart: unless-stopped
    
  certbot:
    image: certbot/certbot
    volumes:
      - ./ssl:/etc/letsencrypt
      - ./www:/var/www/certbot
    command: certonly --webroot --webroot-path=/var/www/certbot --email admin@example.com --agree-tos --no-eff-email -d example.com

九、故障排查与调试

(一)常见HTTPS问题诊断

1. 证书问题排查

# 检查证书详细信息
openssl x509 -in certificate.crt -text -noout

# 验证证书链
openssl verify -CAfile ca-bundle.crt certificate.crt

# 检查私钥匹配
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5

# 测试SSL连接
openssl s_client -connect example.com:443 -servername example.com

2. 握手失败分析

# 详细握手过程
openssl s_client -connect example.com:443 -debug -msg

# 检查支持的加密套件
nmap --script ssl-enum-ciphers -p 443 example.com

# 测试特定TLS版本
openssl s_client -connect example.com:443 -tls1_2

3. 性能问题分析

# 测试连接时间
curl -w "@curl-format.txt" -o /dev/null -s https://example.com

# curl-format.txt内容:
# time_namelookup:  %{time_namelookup}\n
# time_connect:     %{time_connect}\n
# time_appconnect:  %{time_appconnect}\n
# time_pretransfer: %{time_pretransfer}\n
# time_total:       %{time_total}\n

(二)日志分析

Nginx SSL错误日志分析

# 查看SSL相关错误
grep -i ssl /var/log/nginx/error.log

# 常见错误类型:
# SSL_do_handshake() failed - 握手失败
# certificate verify failed - 证书验证失败
# no shared cipher - 没有共同支持的加密套件

Apache SSL日志配置

# 启用SSL日志
LogLevel ssl:info
CustomLog logs/ssl_request_log \
    "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

(三)监控和告警

证书过期监控脚本

#!/bin/bash
# ssl-monitor.sh

HOST="example.com"
PORT="443"
WARN_DAYS=30

# 获取证书过期时间
EXP_DATE=$(echo | openssl s_client -servername $HOST -connect $HOST:$PORT 2>/dev/null | \
           openssl x509 -noout -dates | grep notAfter | cut -d= -f2)

# 计算剩余天数
EXP_EPOCH=$(date -d "$EXP_DATE" +%s)
CUR_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXP_EPOCH - CUR_EPOCH) / 86400 ))

if [ $DAYS_LEFT -lt $WARN_DAYS ]; then
    echo "警告:$HOST 的SSL证书将在 $DAYS_LEFT 天后过期"
    # 发送告警邮件或通知
fi

十、未来发展趋势

(一)TLS 1.3的普及

TLS 1.3作为最新的TLS协议版本,带来了显著的安全性和性能提升:

主要特性

  • 0-RTT握手:在某些情况下实现零往返时间
  • 更强的加密:移除了所有不安全的加密算法
  • 简化的握手:减少了握手的复杂性
  • 前向安全:强制要求完美前向安全

(二)后量子密码学

随着量子计算的发展,传统的RSA和ECC算法面临威胁:

当前算法 → 后量子算法
RSA → CRYSTALS-Kyber (密钥交换)
ECDSA → CRYSTALS-Dilithium (数字签名)
SHA-256 → SHA-3 (哈希函数)

(三)自动化证书管理

ACME协议的发展

  • 更多CA支持ACME协议
  • 企业级证书的自动化管理
  • 证书透明度的自动监控

证书管理平台

# cert-manager在Kubernetes中的应用
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com-tls
spec:
  secretName: example-com-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - example.com
  - www.example.com

十一、总结

HTTPS协议作为现代Web安全通信的基石,通过SSL/TLS协议提供了强大的安全保障。本文深入探讨了HTTPS的技术原理、实现机制和最佳实践,主要内容包括:

核心技术要点

  1. 协议架构:理解SSL/TLS的分层设计和各组件功能
  2. 握手过程:掌握TLS握手的详细流程和密钥协商机制
  3. 加密体系:了解对称加密、非对称加密和数字签名的应用
  4. 证书管理:掌握数字证书的类型、验证和管理方法

实践应用指南

  1. 性能优化:通过会话恢复、OCSP Stapling等技术提升性能
  2. 安全配置:实施安全头部、证书固定等防护措施
  3. 部署实战:在不同平台和环境中正确配置HTTPS
  4. 故障排查:掌握常见问题的诊断和解决方法

发展趋势

  • TLS 1.3的广泛采用将进一步提升安全性和性能
  • 后量子密码学的发展将应对未来的安全挑战
  • 自动化证书管理将简化HTTPS的部署和维护

在实际应用中,我们应该根据具体需求选择合适的证书类型和配置方案,同时关注安全最佳实践,确保Web应用的安全性和可靠性。随着技术的不断发展,HTTPS将继续演进,为互联网安全提供更强的保障。


参考资料

  1. 理解 HTTPS 原理,SSL/TLS协议详解 – 标点符
  2. HTTPS系列干货(一):HTTPS 原理详解 - 知乎
  3. SSL/TLS 握手:关键步骤和重要性说明- 沃通SSL证书!
  4. 一文弄懂HTTPS(II)-TLS/SSL协议握手 | Ayase-252’s wonderland
  5. HTTPS 温故知新(三) —— 直观感受 TLS 握手流程(上)
  6. HTTPS详解二:SSL / TLS 工作原理和详细握手过程 - SegmentFault
  7. RFC 8446: The Transport Layer Security (TLS) Protocol Version 1.3
  8. RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2
  9. 《密码学原理与实践》- Douglas R. Stinson
  10. 《HTTPS权威指南》- Ivan Ristić