SSL 证书是什么:2026 年免费方案 + 验证命令

2026 年免费 SSL 已是默认。用这些 Caddy / Nginx / curl / openssl 命令验证证书、设自动续签,别再被注册商套路花冤枉钱。

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” 流程已完成。
  • 已装好 curlopenssl 用于验证。

实操步骤

  1. 多数 host 自动签发。 在 Vercel、Netlify、Firebase、Cloudflare Pages、Render、Fly 上加好域名,等 “SSL provisioned”——DNS 正确后通常一小时内搞定,你什么都不用做。

  2. 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 现在是 R10R14(旧的 R3/R4 中间证书已被 2025 年底起推出的新「Generation Y」体系替代);ECDSA 证书显示 E5E9。Cloudflare 前置的站点可能显示 Google Trust Services——两者都免费、同等受信。

  1. 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 当前默认值
  1. 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 在首次请求时签发证书并永久续签,证书有效期变短了也能自动应对。

  1. 自托管用 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
  1. Cloudflare 前置的源站——SSL 模式选 “Full (strict)”。 Dashboard → SSL/TLS → Overview → “Full (strict)“。这要求源站有有效证书(Let’s Encrypt 证书,或免费的 15 年有效期 Cloudflare Origin CA 证书)。绝不要用 “Flexible”:它在 Cloudflare 到源站之间走明文 HTTP,不安全,还会引发重定向死循环。

  2. 强制 HTTPS 跳转。 多数 host 自动做。Caddy 默认就跳转。Nginx 这样写:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}
  1. 监控过期作为兜底。 哪怕开了自动续签,一个每周跑一次、检查剩余天数的 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 地址证书正式可用(可选的 shortlived profile,约每 3 天续一次)。
  • 2026 年 5 月 13 日——tlsserver ACME 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 提交。

相关阅读

标签: #独立开发 #域名 #SSL #入门