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):

  1. 相同数据经同一 Hash 算法得到相同摘要,反之亦然
  2. 无法通过摘要反推出原始数据(不可逆)

数字签名用私钥加密摘要,验证数据完整性:

服务端:数据 →[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 为何能防劫持:

  1. 数字证书绑定域名,假冒服务器无法持有对应域名的有效证书
  2. 浏览器验证证书,验证失败即显示安全警告,阻止访问

即使 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 访问

相关页面