繁华依在的小站

🔒 HTTPS 完全指南:免费 SSL 证书,安全从零开始

技术 作者:admin | 发布时间:2026-02-03 16:16 | 更新时间:2026-04-09 00:26 | 阅读:15 |
标签: HTTPS SSL LetsEncrypt Certbot 安全 加密

🔒 HTTPS 完全指南:免费 SSL 证书,安全从零开始

看到浏览器地址栏的小绿锁了吗?🔒 那不是装饰品,那是 HTTPS 的标志!

今天我们来讲讲如何给你的网站加上这把"安全锁",而且完全免费!💰


🤔 为什么需要 HTTPS?

HTTP vs HTTPS

text
 1HTTP(不安全):
 2  就像寄明信片 📮
 3  - 谁都能看内容
 4  - 谁都能改内容
 5  - 容易被窃听
 6
 7HTTPS(安全):
 8  就像寄挂号信 🔒
 9  - 只有收件人能看
10  - 内容不能被篡改
11  - 有身份验证

HTTP 的危险

想象一下:

text
1你在用 HTTP 登录银行:
23密码明文传输 👀
45黑客(同在咖啡厅)看到密码
67你的钱没了 💸

HTTPS 的好处

加密传输:数据加密,第三方无法读取 ✅ 身份验证:确认服务器身份(不是钓鱼网站) ✅ 数据完整:传输过程不被篡改 ✅ SEO 加分:搜索引擎优先收录 HTTPS 网站 ✅ 信任度:用户看到小绿锁更放心 ✅ 功能解锁:HTTP/2、Service Worker 等需要 HTTPS


💰 免费证书方案对比

方案 价格 自动续期 支持通配符 难度
Let's Encrypt 🆓
Cloudflare SSL 🆓
ZeroSSL 🆓 ⭐⭐
自签名 🆓 ⭐⭐⭐
付费证书 💰💰

本文重点:Let's Encrypt + Certbot 🎯


🚀 第一步:安装 Certbot

Ubuntu/Debian

bash
1sudo apt update
2sudo apt install certbot -y

CentOS/RHEL

bash
1sudo yum install epel-release -y
2sudo yum install certbot -y

验证安装

bash
1certbot --version
2# 输出:certbot 2.x.x

📝 第二步:获取证书

方法 1:Standlone 模式(最简单)

适用场景:80 端口未被占用

bash
 1# 停止 Nginx(如果运行)
 2sudo systemctl stop nginx
 3
 4# 获取证书
 5sudo certbot certonly --standalone \
 6  -d yourdomain.com \
 7  -d www.yourdomain.com
 8
 9# 按提示操作:
10# 1. 输入邮箱(用于续期提醒)
11# 2. 同意服务条款
12# 3. 选择是否共享邮箱
13# 4. 完成!

证书位置

text
1证书:/etc/letsencrypt/live/yourdomain.com/fullchain.pem
2私钥:/etc/letsencrypt/live/yourdomain.com/privkey.pem

方法 2:Webroot 模式(不停止服务)

适用场景:Nginx 已运行

bash
1sudo certbot certonly --webroot \
2  -w /var/www/html \
3  -d yourdomain.com \
4  -d www.yourdomain.com

方法 3:Nginx 插件(自动配置)

适用场景:Nginx 已配置域名

bash
1# 安装 Nginx 插件
2sudo apt install python3-certbot-nginx -y
3
4# 一键获取并配置
5sudo certbot --nginx -d yourdomain.com
6
7# Certbot 会自动修改 Nginx 配置!

自动添加的配置

nginx
1server {
2    listen 443 ssl;
3    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
4    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
5    include /etc/letsencrypt/options-ssl-nginx.conf;
6    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
7}

方法 4:DNS 验证(通配符证书)

适用场景:需要 *.domain.com 证书

bash
 1# 安装 DNS 插件(以 Cloudflare 为例)
 2sudo apt install python3-certbot-dns-cloudflare -y
 3
 4# 配置 Cloudflare API Token
 5echo "dns_cloudflare_api_token=YOUR_TOKEN" | sudo tee /etc/letsencrypt/cloudflare.ini
 6sudo chmod 600 /etc/letsencrypt/cloudflare.ini
 7
 8# 获取通配符证书
 9sudo certbot certonly --dns-cloudflare \
10  -d "*.yourdomain.com" \
11  -d "yourdomain.com"

⚙️ 第三步:配置 Nginx

手动配置 SSL

/etc/nginx/conf.d/blog.conf

nginx
 1# HTTP → HTTPS 重定向
 2server {
 3    listen 80;
 4    server_name yourdomain.com www.yourdomain.com;
 5    return 301 https://$server_name$request_uri;
 6}
 7
 8# HTTPS 配置
 9server {
10    listen 443 ssl http2;
11    server_name yourdomain.com www.yourdomain.com;
12
13    # SSL 证书
14    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
15    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
16
17    # SSL 优化配置
18    ssl_protocols TLSv1.2 TLSv1.3;
19    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
20    ssl_prefer_server_ciphers off;
21    ssl_session_cache shared:SSL:10m;
22    ssl_session_timeout 10m;
23
24    # HSTS(强制使用 HTTPS)
25    add_header Strict-Transport-Security "max-age=31536000" always;
26
27    # 其他安全头部
28    add_header X-Frame-Options "SAMEORIGIN" always;
29    add_header X-Content-Type-Options "nosniff" always;
30    add_header X-XSS-Protection "1; mode=block" always;
31
32    # 你的站点配置
33    root /var/www/html;
34}

重载 Nginx

bash
1# 测试配置
2sudo nginx -t
3
4# 重载配置
5sudo systemctl reload nginx
6
7# 完成!🎉

🔄 第四步:自动续期

Let's Encrypt 证书有效期

  • 90 天
  • 自动续期:建议设置 cron 任务

测试自动续期

bash
1# 模拟续期(不实际续期)
2sudo certbot renew --dry-run

输出示例

text
1- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2Processing certificate for yourdomain.com
3- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4Certificate not yet due for renewal
5- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

设置自动续期

方法 1:Systemd Timer(推荐)

bash
1# Certbot 安装时已自动配置
2sudo systemctl status certbot.timer

方法 2:Cron 任务

bash
1# 编辑 crontab
2sudo crontab -e
3
4# 添加以下行(每天凌晨 2 点检查)
50 2 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

续期成功日志

bash
1# 查看续期日志
2sudo journalctl -u certbot -f

🧪 第五步:验证配置

SSL 测试工具

1. SSL Labs

text
1https://www.ssllabs.com/ssltest/

输入域名,测试 SSL 配置,获得 A+ 评分!

评分标准

  • A+:完美配置
  • A:优秀
  • B:良好
  • C:一般
  • F:不及格

2. 命令行测试

bash
1# 测试 HTTPS 访问
2curl -I https://yourdomain.com
3
4# 应该看到:
5# HTTP/1.1 200 OK
6# Server: nginx
7# Strict-Transport-Security: max-age=31536000

3. 浏览器检查

  1. 打开网站:https://yourdomain.com
  2. 点击地址栏的小锁 🔒
  3. 查看证书信息:
    • 颁发者:Let's Encrypt
    • 有效期:90 天
    • 加密:TLS 1.2/1.3

🔒 第六步:安全加固

SSL 协议配置

nginx
1# 只启用安全的协议
2ssl_protocols TLSv1.2 TLSv1.3;
3
4# 禁用不安全的加密套件
5ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
6
7# 优先使用服务器端加密套件
8ssl_prefer_server_ciphers off;

OCSP Stapling

nginx
1# 启用 OCSP Stapling
2ssl_stapling on;
3ssl_stapling_verify on;
4ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
5
6resolver 8.8.8.8 8.8.4.4 valid=300s;
7resolver_timeout 5s;

作用:加速证书验证


HSTS

nginx
1# 强制浏览器使用 HTTPS
2add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

警告:配置后无法撤销!


🚨 故障排查

问题 1:证书获取失败

错误Challenge failed

原因:域名未解析到服务器

解决

bash
1# 检查 DNS 解析
2nslookup yourdomain.com
3dig yourdomain.com
4
5# 确认 A 记录指向服务器 IP

问题 2:Nginx 启动失败

错误SSL certificate error

原因:证书路径错误

解决

bash
1# 检查证书文件
2ls -la /etc/letsencrypt/live/yourdomain.com/
3
4# 确认路径正确
5ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
6ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

问题 3:自动续期失败

错误Renewal failed

原因:80 端口被占用

解决

bash
1# 使用 webroot 模式
2sudo certbot renew --webroot -w /var/www/html

📚 第七步:进阶用法

多域名证书

bash
1# 一个证书包含多个域名
2sudo certbot --nginx -d domain1.com -d domain2.com -d domain3.com

ECC 证书(更小更快)

bash
1# 生成 ECC 证书
2sudo certbot --key-type ecdsa --nginx -d yourdomain.com

优点

  • ✅ 证书更小
  • ✅ 握手更快
  • ✅ 安全性更高

DNS 挑战(通配符)

bash
1# 适用于 *.domain.com
2sudo certbot certonly --dns-cloudflare \
3  -d "*.yourdomain.com" \
4  -d "yourdomain.com" \
5  --key-type ecdsa

🎯 实战案例

场景:博客启用 HTTPS

步骤

bash
 1# 1. 获取证书
 2sudo certbot --nginx -d blog.example.com
 3
 4# 2. 测试自动续期
 5sudo certbot renew --dry-run
 6
 7# 3. 验证
 8curl -I https://blog.example.com
 9
10# 4. SSL Labs 测试
11# https://www.ssllabs.com/ssltest/

结果

  • ✅ A+ 评分
  • ✅ 自动续期工作正常
  • ✅ 所有 HTTP 重定向到 HTTPS

📋 HTTPS 迁移检查清单

准备阶段

  • [ ] 域名已解析到服务器
  • [ ] 80 端口和 443 端口开放
  • [ ] Nginx 已安装并运行
  • [ ] Certbot 已安装

实施阶段

  • [ ] 获取 SSL 证书
  • [ ] 配置 Nginx SSL
  • [ ] HTTP → HTTPS 重定向
  • [ ] 添加安全头部
  • [ ] 重载 Nginx

验证阶段

  • [ ] HTTPS 访问正常
  • [ ] SSL Labs 测试(目标 A+)
  • [ ] 自动续期测试
  • [ ] 检查混合内容警告
  • [ ] 更新所有内部链接为 HTTPS

💡 常见问题 FAQ

Q1: HTTPS 会降低性能吗?

A: 影响极小!现代 CPU 硬件加速,HTTPS 性能损耗 < 5%。而且 HTTP/2 反而更快!


Q2: 免费证书和付费证书有什么区别?

A:

特性 Let's Encrypt 付费证书
加密强度 一样 一样
浏览器信任 一样 一样
保修 有(赔付)
支持程度 社区 专人

Q3: 需要用 Wildcard 证书吗?

A: 大部分情况不需要!单个证书可以包含 100 个域名:

bash
1sudo certbot --nginx \
2  -d domain1.com \
3  -d www.domain1.com \
4  -d domain2.com \
5  -d www.domain2.com \
6  ... \
7  -d domain100.com

🎉 总结

HTTPS 不再是可选项,而是必需品!

核心要点

  1. Let's Encrypt = 免费 + 自动 + 简单
  2. Certbot = 一键配置
  3. 自动续期 = 一次配置,永久有效
  4. 安全加固 = HSTS + 安全头部

下一步

  • [ ] 获取 SSL 证书
  • [ ] 配置 HTTPS
  • [ ] 设置自动续期
  • [ ] 测试 SSL 配置
  • [ ] 获得 A+ 评分

🔗 相关资源


"网络安全从 HTTPS 开始,而 HTTPS 从 Let's Encrypt 开始!" 🔒

下一篇:日志管理和监控,做网站的"侦探"!🔍

评论 (0)

暂无评论,快来抢沙发吧~

发表评论