跳到主要内容

SSL/TLS 与 HTTPS

我们在浏览器地址栏经常看到一个小锁图标 🔒,这表示当前网站使用了 HTTPS。HTTPS 的核心就是 SSL/TLS 协议。简单来说,SSL/TLS 就像给 HTTP 通信加了一层"加密外壳",让数据在传输过程中不会被偷看或篡改。

可以把 HTTP 想象成寄明信片——任何经手的人都能看到内容;而 HTTPS 就像把信放进一个上了锁的保险箱里寄出去,只有收件人有钥匙能打开。

基本概念

SSL 和 TLS 的关系

名称全称说明
SSLSecure Sockets Layer(安全套接层)最早由网景公司开发,已废弃
TLSTransport Layer Security(传输层安全)SSL 的继任者,目前主流版本是 TLS 1.2 和 TLS 1.3

💡 虽然 SSL 已经被淘汰,但人们习惯上仍然把 TLS 叫做"SSL"。当我们说"SSL 证书"时,实际上指的是 TLS 证书。

HTTPS = HTTP + TLS

HTTP 协议栈:              HTTPS 协议栈:
+------------------+ +------------------+
| HTTP | | HTTP |
+------------------+ +------------------+
| TCP | | TLS | ← 加密层
+------------------+ +------------------+
| IP | | TCP |
+------------------+ +------------------+
| IP |
+------------------+

为什么需要 HTTPS?

HTTP 是明文传输的,存在三大安全风险:

1. 窃听风险(机密性)

客户端 ----"密码是123456"---→ 服务器

黑客在中间偷看

2. 篡改风险(完整性)

客户端 ----"转账100元"---→ 服务器

黑客改成"转账10000元"

3. 冒充风险(身份认证)

客户端 ----请求---→ 假冒的服务器(钓鱼网站)

黑客伪装的

TLS 通过加密摘要数字证书分别解决了这三个问题。

加密基础知识

要理解 TLS,需要先了解两种加密方式。

对称加密

发送方和接收方使用同一把密钥进行加密和解密,就像一把钥匙开一把锁:

加密:明文 + 密钥 → 密文
解密:密文 + 密钥 → 明文
  • 优点:速度快,适合加密大量数据
  • 缺点:密钥怎么安全地传给对方?如果密钥在传输中被截获,加密就没意义了
  • 常见算法:AES、ChaCha20

非对称加密

使用一对密钥:公钥和私钥。公钥加密的数据只有私钥能解开,反之亦然:

加密:明文 + 公钥 → 密文     (任何人都可以加密)
解密:密文 + 私钥 → 明文 (只有持有私钥的人能解密)
  • 优点:公钥可以公开传输,不怕被截获
  • 缺点:速度慢,比对称加密慢几十到几百倍
  • 常见算法:RSA、ECDSA

TLS 的混合加密策略

TLS 巧妙地结合了两种加密方式,取长补短:

简单说就是:用非对称加密来安全地交换对称密钥,然后用对称密钥来加密实际数据

数字证书与 CA

问题:怎么确认公钥是真的?

即使使用了非对称加密,还有一个问题:客户端怎么知道收到的公钥确实是服务器的,而不是黑客伪造的?

正常情况:客户端 ←公钥→ 服务器
中间人攻击:客户端 ←黑客的公钥→ 黑客 ←服务器的公钥→ 服务器

解决方案:数字证书

这就需要一个双方都信任的"第三方公证人"——CA(Certificate Authority,证书颁发机构)

证书的签发和验证过程:

证书包含什么?

字段说明
域名证书绑定的网站域名
公钥服务器的公钥
颁发者哪个 CA 颁发的
有效期证书的起止时间
数字签名CA 用私钥对以上信息的签名

证书链

实际中,CA 是分层的,形成一条信任链

根证书(Root CA)          ← 预装在操作系统/浏览器中
↓ 签发
中间证书(Intermediate CA) ← 由根 CA 签发
↓ 签发
服务器证书(End Entity) ← 由中间 CA 签发,网站使用的证书

浏览器验证时会沿着证书链向上追溯,直到找到一个预装的受信任根证书。

TLS 握手过程

TLS 握手是在 TCP 三次握手之后进行的,目的是协商加密参数并交换密钥。

TLS 1.2 握手(2-RTT)

TLS 1.3 握手(1-RTT)

TLS 1.3 大幅简化了握手过程,只需要 1 个往返:

TLS 1.2 vs TLS 1.3

对比项TLS 1.2TLS 1.3
握手往返2-RTT1-RTT(重连 0-RTT)
密钥交换RSA 或 ECDHE仅 ECDHE(前向安全)
对称加密支持多种(含不安全的)仅 AEAD 算法(AES-GCM、ChaCha20)
安全性较好更强,移除了不安全的算法
性能较慢更快

前向安全性

前向安全(Forward Secrecy)是 TLS 1.3 强制要求的重要特性。

问题:如果服务器的私钥泄露了,之前录制的所有加密流量是否都能被解密?

  • 没有前向安全(如 RSA 密钥交换):是的,所有历史流量都能被解密
  • 有前向安全(如 ECDHE 密钥交换):不能,因为每次会话都生成临时密钥,会话结束后销毁
没有前向安全:
私钥泄露 → 所有历史会话密钥可被推导 → 所有历史数据暴露

有前向安全:
私钥泄露 → 临时密钥已销毁,无法推导 → 历史数据仍然安全

实际应用

查看网站证书信息

在浏览器中点击地址栏的锁图标,可以查看证书详情。也可以用命令行:

# 查看网站的证书信息
openssl s_client -connect www.example.com:443 -showcerts

# 查看证书详细内容
echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -text -noout

本地开发生成自签名证书

# 生成自签名证书(仅用于本地开发)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

Nginx 配置 HTTPS

server {
listen 443 ssl;
server_name example.com;

ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

# 推荐的 TLS 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# HSTS:告诉浏览器只用 HTTPS 访问
add_header Strict-Transport-Security "max-age=31536000" always;
}

# HTTP 重定向到 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}

面试常见问题

Q1:HTTPS 的工作原理是什么?简述整个过程。

  1. 客户端发起 HTTPS 请求,连接到服务器的 443 端口
  2. 服务器返回数字证书(包含公钥)
  3. 客户端验证证书的合法性(是否过期、域名是否匹配、CA 是否可信)
  4. 客户端生成随机的会话密钥,用服务器公钥加密后发送给服务器
  5. 服务器用私钥解密得到会话密钥
  6. 双方使用会话密钥进行对称加密通信

Q2:为什么 HTTPS 要用混合加密,而不是全程用非对称加密?

性能原因。非对称加密的计算量远大于对称加密(慢几十到几百倍),如果全程使用非对称加密,通信效率会非常低。所以 TLS 只在握手阶段使用非对称加密来安全地交换对称密钥,之后的数据传输全部使用对称加密。

Q3:什么是中间人攻击?HTTPS 如何防止?

中间人攻击(MITM):攻击者在客户端和服务器之间拦截通信,分别与双方建立连接,转发并可能篡改数据。

客户端 ←→ 中间人 ←→ 服务器

HTTPS 的防御:通过数字证书验证服务器身份。客户端会检查证书是否由受信任的 CA 签发、域名是否匹配、证书是否过期。中间人无法伪造合法的证书(因为没有 CA 的私钥)。

Q4:SSL/TLS 1.2 和 1.3 有什么区别?

方面TLS 1.2TLS 1.3
握手速度2-RTT1-RTT,重连 0-RTT
安全性支持一些不安全的旧算法移除了所有不安全算法
前向安全可选强制
密钥交换支持 RSA 静态密钥交换仅支持临时密钥交换(ECDHE)

Q5:什么是前向安全?为什么重要?

前向安全是指即使服务器的长期私钥泄露,过去的通信记录也无法被解密。这是因为每次会话都使用临时生成的密钥(通过 ECDHE 算法),会话结束后临时密钥被销毁。TLS 1.3 强制要求前向安全。

Q6:浏览器如何验证 SSL 证书?

  1. 检查证书是否在有效期内
  2. 检查证书的域名是否与访问的域名匹配
  3. 沿证书链向上验证,检查每一级证书的签名
  4. 最终确认根证书是否在浏览器/操作系统的受信任列表中
  5. 检查证书是否被吊销(通过 CRL 或 OCSP)

Q7:HTTP 和 HTTPS 的区别?

对比项HTTPHTTPS
端口80443
安全性明文传输,不安全加密传输,安全
证书不需要需要 SSL/TLS 证书
性能较快略慢(TLS 握手开销)
SEO无优势搜索引擎优先收录

Q8:HTTPS 一定是安全的吗?

不一定。以下情况 HTTPS 也可能不安全:

  • 用户主动忽略证书警告:点击"继续访问"不安全的网站
  • 客户端被安装了恶意根证书:中间人可以签发任意域名的证书
  • 使用了过时的 TLS 版本或弱加密算法
  • 服务器配置不当:如私钥泄露、未启用 HSTS 等

延伸阅读