SSL 证书以前是实打实的开销:一年大概 50 到 200 美元,就为了那个 https:// 小锁。到 2026 年 6 月,独立开发者再为它掏钱基本就是浪费。Let’s Encrypt、Google Trust Services 和 Cloudflare 都免费发浏览器信任的证书,而花 300 美元起买的 DigiCert DV 证书,密码学上跟免费那张一模一样。这篇给你心智模型、验证证书的具体命令,以及没用托管平台时的自托管配置。
一句话结论
- 别买证书。 你的 host(Vercel、Firebase、Netlify、Cloudflare Pages、Render、Fly)会自动签一张免费的。源站没托管的,套上 Cloudflare 或自己跑 Caddy / Certbot。
- 免费和付费在安全性上没差。 同样的算法、同样的公共信任根、同样的浏览器锁。给静态站买不到「更安全」的证书。
- 唯一要做的事是自动续签。 2026 年 6 月 Let’s Encrypt 默认仍是 90 天,但有效期在缩短(45 天 profile 已可选,见下文)。手动续签已经不现实——交给平台或 ACME 客户端。
- EV 证书对独立站毫无意义。 浏览器早在 2019 年就拿掉了绿色「公司名」地址栏,访客根本分不出 EV 和免费 DV。
SSL(TLS)证书到底是什么
SSL 证书——技术上叫 TLS 证书,「SSL」是沿用下来的旧称——是一份加密文件,用来证明你正在连接的域名持有对应的私钥。浏览器信任根证书库里某个 Certificate Authority(CA)签发的证书。Let’s Encrypt 和 Google Trust Services 是免费、自动化、被公共信任的 CA。多数现代 host 会用 ACME 协议替你向它们申请并续签证书,你根本碰不到密钥文件。
你是不是已经有可用的 SSL 了?怎么看
- 站点用
https://打开、带小锁——已经有可用 SSL,完事。 - host dashboard 显示「certificate active」或「SSL provisioned」——完事。
- 注册商发邮件说「限时 SSL 优惠」——那是销售话术,不是必需品。
- 浏览器报「不安全」——几乎都是配置或混合内容问题,不是缺了付费证书。
openssl s_client -connect yourdomain.com:443返回有效证书链——协议层已验证。
快速判断
独立开发者不要买 SSL 证书。用 host 给的免费证书(Vercel、Firebase、Netlify、Cloudflare Pages),或者把源站放到 Cloudflare 后面。付费证书只对那些明确需要 OV/EV 身份验证、保险赔付或厂商支持合同的机构才有意义——独立站基本都不需要。
免费 vs 付费 CA 对比(2026 年 6 月)
| 提供方 | 价格 | 有效期 | 续签 | 信任 |
|---|---|---|---|---|
| Let’s Encrypt | 免费 | 90 天(默认);45 天和 6 天 profile 可选 | 自动(ACME) | 全部主流浏览器 |
| Google Trust Services | 免费 | 约 90 天 | 自动(ACME) | 全部主流浏览器 |
| Cloudflare Universal SSL | 免费 | 由 Cloudflare 托管 | 全自动 | 全部主流浏览器 |
| ZeroSSL / Buypass | 有免费档 | 90 天 | 自动(ACME) | 全部主流浏览器 |
| Sectigo DV | 约 8–100 美元/年 | 1 年(398 天上限) | 手动或 ACME | 全部主流浏览器 |
| DigiCert DV/OV/EV | 约 300 美元/年起 | 1 年 | 手动或 ACME | 全部主流浏览器 |
每一行的小锁和加密都完全一样。底部那几行你掏钱买的是身份验证的纸面流程和支持合同,不是「更强」的证书。
开始前准备
- 域名 DNS 已正确指向 host(用
dig yourdomain.com确认)。 - host 的 “Add domain” 流程已完成。
- 已装好
curl和openssl用于验证。
实操步骤
-
多数 host 自动签发。 在 Vercel、Netlify、Firebase、Cloudflare Pages、Render、Fly 上加好域名,等 “SSL provisioned”——DNS 正确后通常一小时内搞定,你什么都不用做。
-
用
curl验证:
curl -vI https://yourdomain.com 2>&1 | grep -E 'subject:|issuer:|HTTP|Verify return code'
# subject: CN=yourdomain.com
# issuer: C=US, O=Let's Encrypt, CN=R11
# HTTP/2 200
# Verify return code: 0 (ok)
Let’s Encrypt 的 RSA 证书 issuer CN 现在是 R10 到 R14(旧的 R3/R4 中间证书已被 2025 年底起推出的新「Generation Y」体系替代);ECDSA 证书显示 E5–E9。Cloudflare 前置的站点可能显示 Google Trust Services——两者都免费、同等受信。
- 用
openssl看证书细节:
echo | openssl s_client -showcerts -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
# subject= /CN=yourdomain.com
# issuer= /C=US/O=Let's Encrypt/CN=R11
# notBefore=Jun 1 00:00:00 2026 GMT
# notAfter=Aug 30 00:00:00 2026 GMT <- 90 天,Let's Encrypt 当前默认值
- VPS 自托管——用 Caddy(零配置 Let’s Encrypt,自动续签内建):
# /etc/caddy/Caddyfile
yourdomain.com {
root * /var/www/yoursite
file_server
encode gzip
}
www.yourdomain.com {
redir https://yourdomain.com{uri} permanent
}
sudo systemctl reload caddy 重载。Caddy 在首次请求时签发证书并永久续签,证书有效期变短了也能自动应对。
- 自托管用 Nginx——配 Certbot:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# 按提示同意条款,Certbot 会改 Nginx 配置并装好续签定时器
sudo systemctl list-timers | grep certbot
# certbot.timer ... (续签检查每天跑两次)
不实际续签,确认续签逻辑能走通:
sudo certbot renew --dry-run
-
Cloudflare 前置的源站——SSL 模式选 “Full (strict)”。 Dashboard → SSL/TLS → Overview → “Full (strict)“。这要求源站有有效证书(Let’s Encrypt 证书,或免费的 15 年有效期 Cloudflare Origin CA 证书)。绝不要用 “Flexible”:它在 Cloudflare 到源站之间走明文 HTTP,不安全,还会引发重定向死循环。
-
强制 HTTPS 跳转。 多数 host 自动做。Caddy 默认就跳转。Nginx 这样写:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
- 监控过期作为兜底。 哪怕开了自动续签,一个每周跑一次、检查剩余天数的 cron 能在续签出问题、访客撞上报错之前先发现:
# scripts/cert-expiry-check.sh
EXPIRY=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null \
| openssl x509 -noout -enddate | sed 's/notAfter=//')
DAYS=$(date -d "$EXPIRY" +%s)
NOW=$(date +%s)
REMAINING=$(( (DAYS - NOW) / 86400 ))
[ "$REMAINING" -lt 14 ] && echo "WARN: $DOMAIN 证书 $REMAINING 天后过期"
有效期在缩短——靠自动化,别靠日历
整个行业的证书有效期都在变短,这让手动续签成了隐患。Let’s Encrypt 官方路线图上的关键日期:
- 2026 年 1 月 15 日——6 天短期证书和 IP 地址证书正式可用(可选的
shortlivedprofile,约每 3 天续一次)。 - 2026 年 5 月 13 日——
tlsserverACME profile 开始可选签发 45 天证书。 - 2026 年 6 月(现在)——默认证书仍是 90 天。什么都不动也不会出问题。
- 2027 年 2 月 10 日——默认 profile 计划降到 64 天。
- 2028 年 2 月 16 日——默认 profile 计划降到 45 天。
实操要点:只要 Caddy、Certbot 或你的平台自动处理 ACME 续签,这些变化对你完全透明。要是有什么东西依赖「90 天」这个假设(写死的提醒、按 90 天算的脚本),现在就去掉它。
执行检查清单
curl -vI返回有效证书,CN 正确,且Verify return code: 0 (ok)。openssl x509 -noout -dates显示notAfter在未来。- 通过
certbot renew --dry-run、Caddy 日志或平台文档确认自动续签生效。 - 若用 Cloudflare 前置源站,SSL 模式为 “Full (strict)”。
- HTTP 自动 301 跳转到 HTTPS。
上线后验证
- 浏览器小锁、无警告。
- SSL Labs 服务器测试 评分至少 A。
- 没有混合内容警告(DevTools → Console)。一个
http://资源就能把小锁变成警告。
容易踩的坑
- 给注册商付 50 美元一年买 DV 证书。 那就是你免费 host 自动装的同款 Let’s Encrypt 级证书,纯利润给他们赚。
- 给独立博客买 EV 证书。 浏览器 2019 年就拿掉了绿色公司名地址栏,访客分不出 EV 和免费 DV,你买的是没人看得见的纸面流程。
- 关掉自动续签然后忘了。 Let’s Encrypt 证书 90 天到期(很快还更短)。一过期,访客立刻撞上
NET::ERR_CERT_DATE_INVALID这种硬报错。 - Cloudflare 用 “Flexible” SSL。 意味着 Cloudflare 到源站走明文 HTTP——不安全,还是重定向死循环的常见原因。永远用 “Full (strict)”。
- 不控制续签却去 pin 特定证书(HPKP 那一套)。 自动续签换证后你的 pin 会无声失效。除非你掌控轮换,否则别 pin。
FAQ
- 免费证书和付费的一样安全吗?: 一样。算法相同,都链到同样的公共信任根,所有主流浏览器同等信任。那个小锁的体验逐字节一致。
- Let’s Encrypt 证书有效期多久?: 截至 2026 年 6 月默认 90 天。45 天 profile 可选(2026 年 5 月 13 日起),6 天短期证书也已正式可用。自动化会续签,你不用操心。
- SSL 和 TLS 有什么区别?: TLS 是现代协议,SSL 是沿用下来的旧称。今天说「SSL 证书」就是 TLS 证书,两个词通用。
- 我的 issuer 显示 R11 不是 R3,是不是错了?: 没错。Let’s Encrypt 已停用 R3/R4 中间证书,现在 RSA 证书用 R10–R14 签发(「Generation Y」体系),ECDSA 证书用 E5–E9。都正常、都受信。
- 需要通配证书吗?: 只有当一张证书要覆盖多个子域名时才需要。Let’s Encrypt 通过 DNS-01 challenge 签发通配证书,而且多数托管 host 本来就替你处理子域名证书。
- HSTS preload 是什么?:
.dev和.app这类 TLD 已被预加载,浏览器在它们上面直接拒绝明文 HTTP。其它 TLD 想加入,就发送Strict-Transport-Security响应头并到 hstspreload.org 提交。