SSL/TLS 与 HTTPS 加密体系
SSL(Secure Sockets Layer,安全套接层)与 TLS(Transport Layer Security,传输层安全协议)是保障 Web 通信安全的加密协议。HTTPS = HTTP + SSL/TLS——在 HTTP 之上叠加一层安全协议,解决明文传输的三大安全问题:窃听、篡改、伪装。
HTTP 明文传输的三大安全问题
| 安全问题 | 说明 | 后果 | 解决方案 | 关键技术 |
|---|---|---|---|---|
| 窃听 | 数据在传输过程中可被截获 | 密码、个人信息泄露 | 加密传输数据 | 对称加密 + 非对称加密 |
| 篡改 | 数据在传输过程中可被修改 | 网页内容被篡改,植入广告或恶意代码 | 校验数据完整性 | Hash 算法 + 数字签名 |
| 伪装/冒充 | 无法确认通信对方的真实身份 | 被钓鱼网站欺骗,信息发送到伪造服务器 | 验证通信方身份 | 数字证书 + CA 中心 |
对称加密与非对称加密
SSL/TLS 在通信中同时使用两种加密方式,取长补短:非对称加密安全交换对称密钥,对称加密高效传输大量数据。
对称加密
同一把密钥既加密又解密。
| 特点 | 说明 |
|---|---|
| 优点 | 加密解密速度快、效率高,适合大规模数据传输 |
| 缺点 | 密钥分发困难;一旦泄露,所有加密信息失效 |
| 适用场景 | 大量数据的加密传输 |
非对称加密
一对密钥:公钥(可公开)+ 私钥(仅持有方保管)。公钥加密的数据只能用私钥解密,反之亦然。
| 特点 | 说明 |
|---|---|
| 优点 | 安全性高,公钥可公开,无需分发密钥 |
| 缺点 | 加解密速度慢,不适合大规模数据 |
| 适用场景 | 密钥交换、数字签名、身份认证 |
SSL 中的分工
非对称加密(安全交换对称密钥)→ 对称加密(高效传输大量数据)| 阶段 | 使用的技术 | 作用 |
|---|---|---|
| 证书验证阶段 | 非对称加密(CA 私钥签名、CA 公钥验证) | 验证服务端真伪 |
| 密钥交换阶段 | 非对称加密(服务端公钥加密、私钥解密) | 安全传递对称密钥 |
| 数据传输阶段 | 对称加密 | 高效加密传输大量数据 |
Hash 摘要与数字签名(防篡改)
Hash 算法将任意长度数据转换为固定长度的摘要(Digest):
- 相同数据经同一 Hash 算法得到相同摘要,反之亦然
- 无法通过摘要反推出原始数据(不可逆)
数字签名用私钥加密摘要,验证数据完整性:
服务端:数据 →[Hash]→ 摘要 →[私钥加密]→ 数字签名 → 发送数据 + 签名
客户端:收到数据 →[Hash]→ 摘要2 | 签名 →[公钥解密]→ 摘要1
对比 摘要1 与 摘要2:一致则未被篡改数字证书与 CA 中心(防伪装)
数字证书是 CA 中心对服务端公钥进行数字签名后得到的文件,用于验证服务端的真实身份。包含:
- 服务端公钥
- 服务端身份信息(域名、组织等)
- 颁发机构(CA)信息
- 有效期
- CA 的数字签名
**CA 中心(Certificate Authority)**是受信任的第三方机构,负责签发和管理数字证书。常见 CA:DigiCert、GlobalSign、Let’s Encrypt、阿里云、腾讯云。
流程:服务端提交公钥 + 身份信息 → CA 用 CA 私钥签名生成证书 → 证书颁发给服务端 → 客户端访问时收到证书 → 客户端用内置的 CA 公钥验证证书真伪。
类比:数字证书 = CA 机构颁发的「身份证」,证明服务端公钥确实属于该域名/组织。
SSL 认证流程:单向认证与双向认证
单向认证(最常用,HTTPS 默认模式)
只验证服务端真伪,确保客户端连接的是真正的服务器,防止钓鱼网站冒充。
1. TCP 三次握手
2. Client Hello(SSL 版本、加密套件列表)
3. Server Hello(选择加密套件、SSL 版本)
4. 服务端发送数字证书(服务端公钥 + CA 签名)
5. 客户端用 CA 公钥验证证书真伪
├─ 验证通过 → 6. 生成 Pre-Master Secret(对称密钥)
│ 7. 用服务端公钥加密密钥并发送
│ 8. 服务端用私钥解密得到对称密钥
│ 9. 后续数据用对称加密传输
└─ 验证失败 → 浏览器显示「连接不安全」双向认证(高安全场景)
同时验证服务端和客户端身份,适用于银行、政务、企业内部系统等。在单向认证基础上,服务端额外请求客户端证书并验证(用户需安装客户端证书)。
对比
| 对比项 | 单向认证 | 双向认证 |
|---|---|---|
| 验证对象 | 客户端验证服务端 | 双向验证(客户端也需提供证书) |
| 适用场景 | 普通网站、电商、博客 | 银行、政务、企业内部系统 |
| 用户体验 | 用户无感知 | 用户需安装客户端证书 |
| 部署复杂度 | 简单 | 复杂 |
TLS 协议版本演进
| 版本 | 状态 | 说明 |
|---|---|---|
| SSL 1.0/2.0/3.0 | 已废弃 | 较早版本,存在安全漏洞 |
| TLS 1.0 | 已废弃 | SSL 3.0 的升级版 |
| TLS 1.1/1.2 | 广泛使用 | 安全可靠(当前主流) |
| TLS 1.3 | 最新 | 性能更好、安全更强 |
名称说明:SSL 这一术语更常用,因此常把安全证书称作「SSL 证书」,但实际大部分使用的是 TLS 协议。两者本质是一回事——SSL 是前身,TLS 是升级版。
证书类型与申请方式
按验证级别
| 类型 | 验证内容 | 特点 | 适用 |
|---|---|---|---|
| DV(域名型) | 仅验证域名所有权 | 价格低,无需组织信息 | 个人项目、博客 |
| OV(企业型) | 验证域名和组织信息 | 显示企业名称 | 企业官网 |
| EV(增强型) | 严格验证 | 地址栏显示企业名称和绿色标识 | 金融/银行等高信任场景 |
按域名数量
| 类型 | 保护范围 |
|---|---|
| 单域名证书 | 一个域名 |
| 通配符证书 | 一个域名及其所有子域名(*.example.com) |
| 多域名证书 | 多个不同域名 |
申请方式
| 方式 | 说明 |
|---|---|
| 付费证书 | 从 CA 机构购买,验证级别丰富,有商业保险,适合生产环境 |
| 免费证书 | 如 Let’s Encrypt,有效期 90 天,可自动续期,适合个人项目 |
| 自签名证书 | 自己生成,仅用于测试环境,浏览器会告警 |
网站劫持与 HTTPS 防御
网站劫持:DNS 解析、路由转发或服务器本身被劫持,导致用户实际访问的是恶意服务器(冒充攻击)。
用户 → 输入域名 → DNS 服务器
├─ 正常:返回正确 IP → 正常网站
└─ 被劫持:返回虚假 IP / 路由重定向 → 假冒网站HTTPS 为何能防劫持:
- 数字证书绑定域名,假冒服务器无法持有对应域名的有效证书
- 浏览器验证证书,验证失败即显示安全警告,阻止访问
即使 DNS 被劫持,配置了有效 SSL 证书的网站也会因证书不匹配触发浏览器告警,从而阻断钓鱼。
HTTPS 配置实战
步骤 1:获取证书(Certbot + Let’s Encrypt)
# 安装 Certbot
yum install certbot python2-certbot-nginx -y
# 申请证书(自动配置 Nginx)
certbot --nginx -d example.com -d www.example.com证书文件位置:
/etc/letsencrypt/live/example.com/
├── fullchain.pem # 完整证书链
├── privkey.pem # 私钥
└── cert.pem # 证书步骤 2:单节点 HTTPS 配置(Nginx)
server {
listen 443 ssl http2;
server_name example.com;
# 证书配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL 协议与加密套件
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;
root /var/www/html;
index index.html;
}步骤 3:HTTP 自动跳转 HTTPS
server {
listen 80;
server_name example.com;
# 301 永久重定向到 HTTPS
return 301 https://$server_name$request_uri;
}步骤 4:全站 HTTPS(集群架构)
全站 HTTPS = 通信链路每一层都使用 HTTPS 或加密协议:用户 → 七层负载均衡器 → Web 层 → php-fpm → MySQL,层层加密。
七层负载均衡器 HTTPS 配置:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
proxy_pass http://web_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}FastCGI + HTTPS(PHP 应用):Nginx 通过 FastCGI 转发给 php-fpm 时,需传递 HTTPS 环境变量,后端代码才能判断请求是否为 HTTPS:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 传递 HTTPS 标识给 PHP
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
include fastcgi_params;
}SSL 配置参数速查
| 参数 | 说明 |
|---|---|
ssl_certificate | 证书文件路径(含完整证书链) |
ssl_certificate_key | 私钥文件路径 |
ssl_protocols | 支持的 TLS 协议版本 |
ssl_ciphers | 允许的加密套件 |
ssl_prefer_server_ciphers | 优先使用服务端加密套件顺序 |
HSTS(Strict-Transport-Security) | 强制浏览器在未来指定时间内始终使用 HTTPS 访问 |
相关页面
- Day47:SSL/TLS 及全站 HTTPS — 当日完整课程摘要
- HTTP 协议 — HTTPS = HTTP + TLS、TLS 握手简流程
- CDN 层(上) — HTTPS 证书管理与 SSL 类型
- Nginx — HTTPS 配置、HTTP→HTTPS 跳转
- DNS — 网站劫持中的 DNS 劫持
- 跨域问题及 Cookie/Session/JWT — 域 = 协议 + 域名 + 端口(https 与 http 不同源)
- iptables / Netfilter — 网络安全基础设施