← 返回

HTTPS 原理学习及 nginx 配置

加密与安全 • 2026年4月11日

一、HTTPS 原理

加密算法的平衡

HTTPS 使用了对称加密和非对称加密的结合:

为什么需要两种加密?

  • 对称加密:速度快,但密钥分发困难。使用同一把密钥加解密数据。
  • 非对称加密:安全可靠,但速度慢。使用公钥加密,私钥解密。

HTTPS 采用了"混合加密"方案:

  1. 客户端和服务器使用 RSA 非对称加密来交换对称密钥
  2. 交换密钥后,使用对称加密进行数据传输,确保高效率
  3. 这样既保证了安全性,也满足了性能需求

参考:RSA 非对称加密学习

公钥交换过程中的风险

仅使用 RSA 交换密钥还不够安全,存在中间人攻击的风险:

中间人攻击流程
  1. 第一步:浏览器向网站服务器请求,服务器把公钥 e 明文传输给浏览器
  2. 第二步:中间人劫持到公钥 e,保存下来,把数据包中的公钥 e 替换成自己伪造的公钥 E(中间人持有对应私钥 D
  3. 第三步:浏览器生成对称加密密钥 X,用中间人公钥 E 加密后传给服务器
  4. 第四步:中间人劫持后用私钥 D 解密得到密钥 X,再用服务器公钥 e 加密后传给服务器
  5. 第五步:服务器用私钥 d 解密得到密钥 X

结果:浏览器和服务器都不知道的是,中间人已经拿到对称密钥 X,可以解密所有数据包内容。

解决方案:CA 证书

CA(Certificate Authority,证书颁发机构)通过签发证书来保证服务器公钥的合法性:

证书的作用

证书中包含以下信息:

  • 网站域名
  • 服务器公钥 e
  • 证书颁发机构信息
  • 有效期等元数据

CA对证书信息进行散列计算,用CA私钥加密得到数字签名,包含在证书中

证书验证流程
服务器端:
1. 提前向 CA 申请证书
2. 客户端请求时,服务器将证书发送给客户端

客户端:
1. 收到证书后,用 CA 公钥解密数字签名得到原始散列值
2. 对证书数据进行 SHA-256 散列计算得到另一散列值
3. 比对两个散列值,若相同则证书合法
4. 从证书中提取服务器公钥 e,随后用 e 加密对称密钥
证书的防伪机制

数字签名由证书数据散列后通过 CA 私钥加密得到,因此:

  • 若中间人要篡改证书内容:
    • 客户端计算的散列值会与签名中的散列值不匹配,证书验证失败
  • 若中间人要篡改内容并修改数字签名:
    • 需要用 CA 私钥重新加密证书,但中间人没有 CA 私钥,无法加密
  • 若中间人想掉包整个证书:
    • 中间人向CA申请另一证书(使用CA私钥加密),新证书会包含不同的服务器信息(域名、公钥等),不匹配访问的服务器,验证失败
那么 CA 公钥又怎么安全获得呢?

浏览器内置了可信 CA 机构的证书。如果遇到不认识的 CA,用户需要手动下载并安装该 CA 的根证书。

二、nginx 配置 HTTPS

第一步:申请证书

以腾讯云为例(其他云服务商流程类似):

1. 申请免费证书

访问 腾讯云 SSL 证书控制台

  • 选择"申请证书"
  • 填写域名信息
  • 选择验证方式(通常为 DNS 验证)
腾讯云 SSL 证书申请界面

2. DNS 验证

按照提示配置 DNS 记录(验证域名所有权):

  • 登录域名的 DNS 管理后台
  • 添加 TXT 记录,内容为提供的验证码
  • 验证通过后,证书申请完成
DNS 验证配置

3. 下载证书

申请成功后:

  • 下载证书文件(通常为 .crt 和 .key 文件)
  • 上传至 nginx 服务器,注意记下上传的路径
下载证书文件

第二步:nginx 配置修改

HTTP 重定向到 HTTPS

添加 HTTP(80 端口)服务器块,将所有请求重定向到 HTTPS:

server {
    listen       80;
    server_name  internetsb.site;

    # HTTP 重定向到 HTTPS
    return 301 https://$server_name$request_uri;
}

HTTPS 服务器配置

添加 HTTPS(443 端口)服务器块,启用 TLS 和 HTTP/2:

server {
    listen       443 ssl;
    # 启用 HTTP/2以获得更好的性能
    http2 on;
    server_name  internetsb.site;

    # 证书和密钥路径
    ssl_certificate      /path/to/internetsb.site_bundle.crt;
    ssl_certificate_key  /path/to/internetsb.site.key;

    # TLS 版本配置(只支持安全的版本)
    ssl_protocols TLSv1.2 TLSv1.3;

    # 其他配置...
    location / {
        root  /path/to/site;
        index index.html;
    }
}

第三步:重新编译 nginx

nginx 默认编译时不包含 SSL 和 HTTP/2 支持,如果之前没编译需要重新编译:

⚠️ 注意:重新编译前需要备份现有 nginx 配置和停止服务
# 进入 nginx 源码目录

# 配置时添加 SSL 和 HTTP/2 模块选项
./configure \
  --with-http_ssl_module \
  --with-http_v2_module

# 编译和安装
make
make install

# 重启 nginx
nginx -s reload

验证配置

配置完成后,可以通过以下方式验证:

1. 检查 nginx 配置语法

nginx -t

3. 在浏览器中访问

使用 HTTPS 协议访问网站:https://yourdomain.com

  • 点击域名栏图标可查看证书详情
  • 相关资源

    RSA 原理学习