HTTPS加密原理详解,TLS握手到底在干什么

浏览器地址栏那个小锁,代表的就是HTTPS。现在几乎所有网站都上了HTTPS,但它的加密原理你真的清楚吗?

今天从对称加密讲到非对称加密,再到TLS握手的完整流程。

为什么HTTP不安全

HTTP是明文传输的,中间任何节点(路由器、运营商、WiFi热点)都能看到你的数据。

css 复制代码
浏览器 → [明文] → 路由器 → [明文] → 运营商 → [明文] → 服务器
                ↑ 每个节点都能看到内容

攻击者可以窃听、篡改、冒充。HTTPS就是来解决这些问题的。

对称加密:快但密钥分发困难

对称加密就是加密和解密用同一个密钥:

复制代码
明文 + 密钥 → 密文
密文 + 密钥 → 明文

常见算法:AES、DES、3DES

问题:密钥怎么安全地传给对方?

arduino 复制代码
浏览器:"我用密钥ABC加密了"
→ 攻击者截获了密钥ABC
→ 完蛋

非对称加密:安全但慢

非对称加密有一对密钥:公钥(公开)和私钥(保密)。

复制代码
公钥加密 → 私钥解密(加密通信)
私钥签名 → 公钥验证(数字签名)

常见算法:RSA、ECC

复制代码
服务器把公钥发给浏览器
浏览器用公钥加密数据 → 只有服务器的私钥能解密

问题:非对称加密很慢,比对称加密慢100-1000倍。

TLS握手:结合两者的优势

HTTPS的方案是:用非对称加密协商出一个对称密钥,然后用对称密钥通信。

markdown 复制代码
1. 非对称加密协商密钥(安全但慢,只用一次)
2. 对称加密传输数据(快,后续都用这个)

TLS 1.2握手流程(简化):

arduino 复制代码
客户端                              服务端
  |                                    |
  |--- ClientHello ------------------>|  支持的加密套件、随机数Client Random
  |                                    |
  |<-- ServerHello --------------------|  选定的加密套件、随机数Server Random、证书
  |                                    |
  |  验证证书(CA签发,确认身份)         |
  |                                    |
  |--- 生成Pre-Master ---------------->|  用服务器公钥加密的Pre-Master Secret
  |                                    |
  |  双方各自计算Master Secret:         |
  |  Master = f(Client Random,          |
  |             Server Random,          |
  |             Pre-Master)             |
  |                                    |
  |  后续通信全部用Master Secret作为      |
  |  对称密钥加密                        |

TLS 1.3简化了握手,只需要1个RTT(甚至0-RTT恢复):

对比 TLS 1.2 TLS 1.3
握手RTT 2次 1次(0-RTT可选)
支持的加密套件 多(有些不安全) 只保留安全的
前向安全 可选 强制

数字证书:确认你是你

HTTPS还有一个关键问题:怎么确认服务器的公钥是真的,不是中间人伪造的?

答案是数字证书,由CA(Certificate Authority)签发。

vbnet 复制代码
证书内容:
├── 域名:www.example.com
├── 公钥:RSA 2048-bit
├── 颁发者:Let's Encrypt
├── 有效期:2026-01-01 ~ 2027-01-01
├── 签名:CA用私钥对以上内容签名
└── ...

浏览器验证证书的流程:

  1. 检查域名是否匹配
  2. 检查是否过期
  3. 用CA的公钥验证签名(CA的公钥内置在操作系统/浏览器中)
  4. 验证证书链(中间CA → 根CA)

在Nginx中配置HTTPS

nginx 复制代码
server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

免费证书方案:Let's Encrypt + Certbot,自动续签。

bash 复制代码
# 安装certbot
apt install certbot python3-certbot-nginx

# 自动获取证书并配置Nginx
certbot --nginx -d www.example.com

HTTPS的核心思路就是:非对称加密安全地交换密钥,对称加密高效地传输数据,数字证书防止中间人攻击。

理解了这些,遇到SSL/TLS相关的问题就有了排查方向。

相关推荐
2501_9160088918 小时前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
李纲明3 天前
WordPress 登录后跳回登录页或提示「Cookie 被阻止」:先核站点 URL 与 HTTPS 一致,再查安全插件与 CDN
https·登录·cdn·wordpress·cookie·devdiy·站点url
李纲明3 天前
WordPress 全站 HTTPS 后仍显示「不安全」或锁被划掉:先清混合内容,再核证书链与强制跳转
网络协议·安全·https·wordpress·devdiy·混合内容
Lsetea3 天前
Certbot webroot申请SSL证书总是404:Nginx挑战目录与路径映射检查
运维·nginx·https·ssl证书·certbot
山乐191314 天前
麒麟系统,安装Nginx并配置https证书
运维·nginx·https
tedcloud1234 天前
Docker Compose 部署 Uptime Kuma:配置 HTTPS、QQ 邮箱告警与数据备份
服务器·网络协议·ui·docker·容器·https·开源
嵌入式学习菌4 天前
HTTP/HTTPS、MQTT/MQTTS 区别
网络协议·http·https
2501_915106324 天前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
zxanz16 天前
证书运维自动化,守住业务 HTTPS 底线
运维·https·自动化
Lsetea6 天前
Git访问HTTPS证书不受信任:用URL级sslCAInfo限定私有CA范围
git·https·开发工具·ssl证书·ca证书