Nginx配置HTTPS,Let's Encrypt免费SSL证书申请
前言
现在网站没个 HTTPS 都不好意思拿出来,浏览器直接标"不安全"。申请 SSL 证书以前要花钱买,现在有了 Let's Encrypt,免费申请,90天有效期,还能自动续期。本文就讲一下怎么用 Let's Encrypt 给 Nginx 配 HTTPS。
前提条件
申请 SSL 证书之前,先确认:
- 域名已经解析到服务器 IP
- 80 端口已经开放(防火墙、安全组都要开)
- Nginx 已经能正常跑 HTTP
这三个条件满足了才能申请成功。
第一步:安装 certbot
certbot 是 Let's Encrypt 官方的证书申请工具。
yum install certbot python2-certbot-nginx -y
这个包会自动装 certbot 和 Nginx 插件。
第二步:申请证书
自动申请并配置
certbot --nginx -d www.example.com -d example.com
参数说明:
--nginx:自动修改 Nginx 配置-d:指定域名,可以写多个
执行过程中会问你:
- 邮箱地址:填你的邮箱,证书过期了会提醒你
- 同意服务条款:输入 A
- 是否接收邮件:输入 N
- 是否把 HTTP 跳转到 HTTPS:选 2(跳转)
等待申请完成,一般几秒钟就好。
第三步:测试 HTTPS
浏览器访问 https://www.example.com,应该能看到小锁标志了。
HTTP 访问 http://www.example.com 会自动跳转到 HTTPS。
证书文件位置
申请完的证书文件都在 /etc/letsencrypt/live/域名/ 目录下:
/etc/letsencrypt/live/www.example.com/
├── cert.pem # 证书
├── chain.pem # 中间证书
├── fullchain.pem # 证书+中间证书(Nginx用这个)
└── privkey.pem # 私钥
Nginx 配置里用的是:
ssl_certificate /etc/letsencrypt/live/域名/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/域名/privkey.pem;
自动续期
Let's Encrypt 证书有效期只有 90 天,需要定期续期。
测试自动续期
certbot renew --dry-run
如果没报错,说明自动续期配置没问题。
自动续期定时任务
certbot 装完会自动加一个定时任务,不用管。可以看看:
crontab -l
或者:
systemctl list-timers | grep certbot
手动配置 HTTPS
如果不想用 certbot 自动改配置,也可以手动写 Nginx 配置。
Nginx HTTPS 配置示例
server {
listen 80;
server_name www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/html/test;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
检查并重载
nginx -t
systemctl reload nginx
常见坑
坑1:域名没解析就申请
域名还没解析到服务器,就开始申请证书,结果申请失败。
解决: 先 ping 一下域名,确认解析到你服务器 IP 了再申请。
坑2:80 端口没开
防火墙或安全组没开 80 端口,Let's Encrypt 验证不了你的域名,申请失败。
解决: 先开 80 端口:
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
云服务器还要在安全组里开 80 端口。
坑3:证书到期了没续期
忘了续期,证书过期了,浏览器报不安全。
解决: certbot 会自动续期,不用管。但要确认自动续期服务在运行:
systemctl status certbot-renew.timer
坑4:HTTPS 配置完了 404
配完 HTTPS 访问 404,一般是 root 目录或者 server_name 写错了。
排查:
- 看 Nginx 配置里的
server_name对不对 - 看
root目录对不对 nginx -t检查配置语法
总结
Nginx 配置 HTTPS 的完整流程:
- 装 certbot:
yum install certbot python2-certbot-nginx -y - 申请证书:
certbot --nginx -d www.example.com - 自动续期:certbot 自动搞定,不用管
- 测试:浏览器访问 HTTPS,看小锁标志
Let's Encrypt 免费证书是现在最流行的方案,不用花钱就能给网站上 HTTPS。
遇到问题加QQ23979811 协助处理
HTTPS 原理详解:从证书到握手的完整流程
前言
HTTPS 现在已经是网站标配了,但很多人只知道"HTTPS 更安全",却不知道它到底是怎么安全的。本文用最通俗的方式,带你完整理解 HTTPS 的工作原理。
一、HTTP 为什么不安全
HTTP 是明文传输的,就像你在明信片上写信,邮局的每个人都能看到内容。
具体来说,HTTP 有三个问题:
- 窃听风险:中间人可以看到你传输的所有内容
- 篡改风险:中间人可以修改你传输的内容
- 冒充风险:中间人可以冒充服务器欺骗你
HTTPS 就是为了解决这三个问题而生的。
二、HTTPS = HTTP + SSL/TLS
HTTPS 本质上就是在 HTTP 和 TCP 之间加了一层 SSL/TLS 协议。
TLS 做了三件事:
- 加密:数据加密传输,中间人看不到内容
- 完整性校验:数据被篡改了能发现
- 身份认证:确认你连接的是真的服务器
三、数字证书
HTTPS 信任的基础是数字证书。
你可以把数字证书理解成身份证:
- 谁发的:CA 机构(证书颁发机构)
- 证明什么:这个域名属于谁
- 有效期:身份证有有效期,证书也有
- 怎么验证:CA 用私钥签名,浏览器用公钥验证
常见的免费证书:Let's Encrypt
四、TLS 握手流程
TLS 握手是 HTTPS 最核心的部分,用大白话讲一遍:
第一步:Client Hello
客户端说:"你好,我支持这些加密算法,这是我的随机数 A。"
Client → Server:
- TLS 版本
- 支持的加密算法列表
- 随机数 A
第二步:Server Hello
服务器说:"好的,我们用这个加密算法,这是我的随机数 B,这是我的证书。"
Server → Client:
- 选择的加密算法
- 随机数 B
- 数字证书(包含服务器公钥)
第三步:客户端验证证书
客户端做几件事:
- 证书是不是可信 CA 签的?
- 证书过期了没?
- 证书上的域名和当前访问的域名一致吗?
验证通过,才继续。
第四步:生成会话密钥
客户端用服务器公钥加密一个"预主密钥"发给服务器。
Client → Server:
- 预主密钥(用服务器公钥加密)
服务器用自己的私钥解密,拿到预主密钥。
然后客户端和服务器都用:
- 随机数 A
- 随机数 B
- 预主密钥
这三个东西,计算出会话密钥(Session Key)。
第五步:开始加密通信
双方都有了会话密钥,之后的所有通信都用这个密钥加密。
Client ↔ Server:
- 用会话密钥加密的数据
五、为什么用非对称加密交换密钥,对称加密传数据
这是很多人困惑的点:
- 非对称加密(公钥私钥):安全但慢
- 对称加密(同一个密钥):快但不安全
HTTPS 的设计很巧妙:
- 先用非对称加密安全地交换会话密钥(只交换一次)
- 然后用对称加密快速传输数据(所有通信都用这个密钥)
既保证了安全,又保证了性能。
六、证书链
一张证书不是孤立的,它背后有一条证书链:
根证书(Root CA)
└─ 中间证书(Intermediate CA)
└─ 服务器证书(你的网站)
浏览器信任根证书,根证书签中间证书,中间证书签你的服务器证书。这样一层层验证下来,就信任了你的服务器证书。
七、常见问题
1. 为什么有的网站 HTTPS 显示"不安全"
通常是因为:
- 证书过期了
- 证书域名不匹配
- 证书是自签名的,不是可信 CA 签发的
- 页面里混了 HTTP 的资源
2. HTTPS 一定安全吗?
不一定。如果:
- 你电脑上的根证书被篡改了
- CA 机构被攻破了
- 你主动信任了恶意证书
那 HTTPS 也会不安全。
3. HTTPS 会影响性能吗?
会有一点影响,主要在握手阶段。但现在 TLS 1.3 已经把握手优化到 1-RTT,加上会话复用,性能影响很小了。
总结
HTTPS 的核心思路:
- 用非对称加密安全交换会话密钥
- 用对称加密快速传输数据
- 用数字证书验证服务器身份
- 用 MAC 校验数据完整性
搞懂这四点,HTTPS 的原理你就掌握了一大半。