SSL 证书以前是真要花钱——一年 50-200 美元买 https:// 的特权。2026 年在独立开发者场景下基本是套路。Let’s Encrypt 和 Cloudflare 免费发证书,浏览器同等信任。下面给出心智模型、验证命令和自托管配置。
问题背景
SSL(技术上是 TLS)证书是一份加密文件,证明你正连的域名就是证书签发对应的域名。浏览器信任由 Certificate Authority(CA)签发的证书。Let’s Encrypt 是免费、自动化、浏览器信任的 CA。多数现代 host 自动从它那签证书。
判断标准
- 站点
https://加锁——已经有 SSL 了。 - 注册商邮件说「限时 SSL 优惠」——销售话术,不是必须。
- host dashboard 显示「certificate active」或「SSL provisioned」——完事。
- 浏览器报「不安全」——多半是配置问题,不是缺付费证书。
openssl s_client -connect yourdomain.com:443返回有效证书链。
快速结论
独立开发者不要买 SSL。用 host(Vercel / Firebase / Netlify / Cloudflare Pages、非托管站用 Cloudflare)的免费证书。只有企业级 EV(扩展验证)需求才考虑付费——独立站几乎用不上。
开始前准备
- 域名 DNS 已指向 host。
- host 的 “Add domain” 流程已完成。
- 装好
curl和openssl做验证。
实操步骤
-
多数 host 自动签发。 Vercel、Netlify、Firebase、Cloudflare Pages、Render、Fly——加域名后等 “SSL provisioned”(DNS 正确后通常 < 1 小时)。
-
用
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=R3
# HTTP/2 200
# Verify return code: 0 (ok)
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=R3
# notBefore=May 1 00:00:00 2026 GMT
# notAfter=Jul 30 00:00:00 2026 GMT ← Let's Encrypt 90 天
- 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
# 按提示同意条款,自动改 Nginx 配置 + 自动续签
sudo systemctl list-timers | grep certbot
# certbot.timer ... (每天两次自动续签)
不实际续签验证逻辑可走通:
sudo certbot renew --dry-run
-
Cloudflare 前置——SSL 模式选 “Full (strict)”。 Dashboard → SSL/TLS → “Full (strict)“。这要求源站有有效证书(Let’s Encrypt 或自签)。“Flexible” 是 Cloudflare 到源站走 HTTP,不安全。
-
HTTP 强制跳转 HTTPS: 多数 host 自动。自托管时 Caddy 自带;Nginx:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
- 设过期监控。 cron 每周 ping 一次:
# scripts/cert-expiry-check.sh
DAYS=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null \
| openssl x509 -noout -enddate | sed 's/notAfter=//' \
| xargs -I{} date -d "{}" +%s)
NOW=$(date +%s)
REMAINING=$(( (DAYS - NOW) / 86400 ))
[ "$REMAINING" -lt 14 ] && echo "WARN: $DOMAIN 证书 $REMAINING 天后过期"
执行检查清单
curl -vI返回的证书 CN 正确。openssl x509 -noout -dates显示未来过期。certbot renew --dry-run或平台文档确认自动续签生效。- Cloudflare(如用)SSL 模式 “Full (strict)”。
- HTTP 自动 301 到 HTTPS。
上线后验证
- 浏览器锁、无警告。
- SSL Labs(https://www.ssllabs.com/ssltest/)评分 A 或以上。
- DevTools → Console 没有 mixed-content 警告。
容易踩的坑
- 给注册商付 50 美元一年让他们装 SSL——纯利润。
- 给独立博客买 EV(扩展验证)证书——浏览器早就不为 EV 显示特殊 UI,对终端用户和 DV 没差。
- 关掉 Let’s Encrypt 自动续签然后忘了,90 天后访客撞证书报错。
- Cloudflare 用「Flexible」SSL——Cloudflare 到源站走 HTTP,不安全还破坏某些流程。永远「Full (strict)」。
- 不控制续签时在代码 / header 里 pin 特定证书——自动续签会断,用户投诉了你才发现。
FAQ
- 免费证书和付费一样安全吗?: 一样。算法相同、根 CA 相同、所有主流浏览器同等信任。
- Let’s Encrypt 证书多久续一次?: 90 天。自动化做的——你不应该需要操心。
- SSL 和 TLS 有啥区别?: TLS 是现代协议名,SSL 是早期名仍口语化在用。今天说「SSL 证书」意思就是 TLS 证书。
- 需要通配证书吗?: 一个证书覆盖多个子域名才需要。Let’s Encrypt 通过 DNS challenge 提供通配证书。多数 host 替你搞定。
- HSTS preload 是什么?:
.dev和.app已 preload,浏览器拒绝 HTTP。其它 TLD 可加Strict-Transport-Security响应头主动加入。