繁华依在的小站

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

技术 作者:admin | 发布时间:2026-02-03 16:16 | 更新时间:2026-02-07 16:19 | 阅读:4 |
标签: HTTPS SSL LetsEncrypt Certbot 安全 加密

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

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

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


🤔 为什么需要 HTTPS?

HTTP vs HTTPS

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
HTTP(不安全):
  就像寄明信片 📮
  - 谁都能看内容
  - 谁都能改内容
  - 容易被窃听

HTTPS(安全):
  就像寄挂号信 🔒
  - 只有收件人能看
  - 内容不能被篡改
  - 有身份验证

HTTP 的危险

想象一下:

text
1
2
3
4
5
6
7
你在用 HTTP 登录银行:
    ↓
密码明文传输 👀
    ↓
黑客(同在咖啡厅)看到密码
    ↓
你的钱没了 💸

HTTPS 的好处

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


💰 免费证书方案对比

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

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


🚀 第一步:安装 Certbot

Ubuntu/Debian

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

CentOS/RHEL

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

验证安装

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

📝 第二步:获取证书

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

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

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 停止 Nginx(如果运行)
sudo systemctl stop nginx

# 获取证书
sudo certbot certonly --standalone \
  -d yourdomain.com \
  -d www.yourdomain.com

# 按提示操作:
# 1. 输入邮箱(用于续期提醒)
# 2. 同意服务条款
# 3. 选择是否共享邮箱
# 4. 完成!

证书位置

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

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

适用场景:Nginx 已运行

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

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

适用场景:Nginx 已配置域名

bash
1
2
3
4
5
6
7
# 安装 Nginx 插件
sudo apt install python3-certbot-nginx -y

# 一键获取并配置
sudo certbot --nginx -d yourdomain.com

# Certbot 会自动修改 Nginx 配置!

自动添加的配置

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

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

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

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装 DNS 插件(以 Cloudflare 为例)
sudo apt install python3-certbot-dns-cloudflare -y

# 配置 Cloudflare API Token
echo "dns_cloudflare_api_token=YOUR_TOKEN" | sudo tee /etc/letsencrypt/cloudflare.ini
sudo chmod 600 /etc/letsencrypt/cloudflare.ini

# 获取通配符证书
sudo certbot certonly --dns-cloudflare \
  -d "*.yourdomain.com" \
  -d "yourdomain.com"

⚙️ 第三步:配置 Nginx

手动配置 SSL

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

nginx
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# HTTP → HTTPS 重定向
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS 配置
server {
    listen 443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;

    # SSL 证书
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # SSL 优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # HSTS(强制使用 HTTPS)
    add_header Strict-Transport-Security "max-age=31536000" always;

    # 其他安全头部
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # 你的站点配置
    root /var/www/html;
}

重载 Nginx

bash
1
2
3
4
5
6
7
# 测试配置
sudo nginx -t

# 重载配置
sudo systemctl reload nginx

# 完成!🎉

🔄 第四步:自动续期

Let's Encrypt 证书有效期

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

测试自动续期

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

输出示例

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

设置自动续期

方法 1:Systemd Timer(推荐)

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

方法 2:Cron 任务

bash
1
2
3
4
5
# 编辑 crontab
sudo crontab -e

# 添加以下行(每天凌晨 2 点检查)
0 2 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

续期成功日志

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

🧪 第五步:验证配置

SSL 测试工具

1. SSL Labs

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

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

评分标准

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

2. 命令行测试

bash
1
2
3
4
5
6
7
# 测试 HTTPS 访问
curl -I https://yourdomain.com

# 应该看到:
# HTTP/1.1 200 OK
# Server: nginx
# 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
2
3
4
5
6
7
8
# 只启用安全的协议
ssl_protocols TLSv1.2 TLSv1.3;

# 禁用不安全的加密套件
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';

# 优先使用服务器端加密套件
ssl_prefer_server_ciphers off;

OCSP Stapling

nginx
1
2
3
4
5
6
7
# 启用 OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;

resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

作用:加速证书验证


HSTS

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

警告:配置后无法撤销!


🚨 故障排查

问题 1:证书获取失败

错误Challenge failed

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

解决

bash
1
2
3
4
5
# 检查 DNS 解析
nslookup yourdomain.com
dig yourdomain.com

# 确认 A 记录指向服务器 IP

问题 2:Nginx 启动失败

错误SSL certificate error

原因:证书路径错误

解决

bash
1
2
3
4
5
6
# 检查证书文件
ls -la /etc/letsencrypt/live/yourdomain.com/

# 确认路径正确
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

问题 3:自动续期失败

错误Renewal failed

原因:80 端口被占用

解决

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

📚 第七步:进阶用法

多域名证书

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

ECC 证书(更小更快)

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

优点

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

DNS 挑战(通配符)

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

🎯 实战案例

场景:博客启用 HTTPS

步骤

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1. 获取证书
sudo certbot --nginx -d blog.example.com

# 2. 测试自动续期
sudo certbot renew --dry-run

# 3. 验证
curl -I https://blog.example.com

# 4. SSL Labs 测试
# 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
1
2
3
4
5
6
7
sudo certbot --nginx \
  -d domain1.com \
  -d www.domain1.com \
  -d domain2.com \
  -d www.domain2.com \
  ... \
  -d domain100.com

🎉 总结

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

核心要点

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

下一步

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

🔗 相关资源


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

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

评论 (0)

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

发表评论