HTTPS 原理学习及 nginx 配置
一、HTTPS 原理
加密算法的平衡
HTTPS 使用了对称加密和非对称加密的结合:
为什么需要两种加密?
- 对称加密:速度快,但密钥分发困难。使用同一把密钥加解密数据。
- 非对称加密:安全可靠,但速度慢。使用公钥加密,私钥解密。
HTTPS 采用了"混合加密"方案:
- 客户端和服务器使用 RSA 非对称加密来交换对称密钥
- 交换密钥后,使用对称加密进行数据传输,确保高效率
- 这样既保证了安全性,也满足了性能需求
参考:RSA 非对称加密学习
公钥交换过程中的风险
仅使用 RSA 交换密钥还不够安全,存在中间人攻击的风险:
中间人攻击流程
- 第一步:浏览器向网站服务器请求,服务器把公钥
e明文传输给浏览器 - 第二步:中间人劫持到公钥
e,保存下来,把数据包中的公钥e替换成自己伪造的公钥E(中间人持有对应私钥D) - 第三步:浏览器生成对称加密密钥
X,用中间人公钥E加密后传给服务器 - 第四步:中间人劫持后用私钥
D解密得到密钥X,再用服务器公钥e加密后传给服务器 - 第五步:服务器用私钥
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. 申请免费证书
- 选择"申请证书"
- 填写域名信息
- 选择验证方式(通常为 DNS 验证)
2. DNS 验证
按照提示配置 DNS 记录(验证域名所有权):
- 登录域名的 DNS 管理后台
- 添加 TXT 记录,内容为提供的验证码
- 验证通过后,证书申请完成
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