从0到1:SSL证书申请与部署完全指南(附避坑手册)

SSL证书这事儿,我刚上手的时候觉得不就买个证装上嘛,结果连栽三个跟头。第一次买了个OV证书,花了好几百,后来发现小破站根本用不上,纯属浪费钱。第二次配完,Chrome直接给我个大红叉,查半天才发现是域名和证书没对上。第三次更绝,续期定时器不知道啥时候停了,证书过期整整三天我才发现。

(开篇配图:一张浏览器地址栏显示小锁+“安全”的截图,突出最终效果)

先来看选证书这事儿。市面上就那么几种:DV、OV、EV。我一开始搞错了,傻乎乎花几百块买了OV,结果对我这博客来说,除了贵没任何卵用。DV就够用了,免费的Let’s Encrypt真香。

DV就是验证你是不是域名主人,几分钟搞定,免费的大把。OV得验证公司身份,适合正经官网或者电商,贵点但能让用户看到公司名。EV最高级,浏览器直接显示公司名加绿背景,银行支付平台才用得上。个人博客选DV够够的,别学我交那个学费。

接着是配置。手动上传CSR?那是2010年的玩法了。现在都用certbot,Let’s Encrypt官方出的家伙事儿。以Ubuntu为例:

bash
sudo apt update
sudo apt install certbot python3-certbot-nginx
`

然后一键申请:

`bash
sudo certbot --nginx -d example.com -d www.example.com
`

这个命令自动验证域名所有权、生成证书、改Nginx配置。第一次跑会让你输个邮箱收续期提醒,别的不用管。官方文档写得跟天书似的,其实核心就这两步。

对了,虽然certbot帮你配了Nginx,我建议还是自己动手调一下。它自动配的有时不够优雅,比如HTTPS重写可能写得不对。我用的这个模板,调了三年才找到的:

`nginx
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name example.com www.example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
root /var/www/example.com;
index index.html;
}
}
`

还有个巨坑:自动续期。Let's Encrypt证书只有90天有效期,这个设计有待改进,但免费就得忍着。certbot默认带了个定时器,得检查它是不是在跑:

`bash
sudo systemctl status certbot.timer
`

状态要是active (running)就正常。我之前遇到过服务器跑久了,这个定时器卡死了,原因是日志文件太大。我找了半天才找到解决方案,加一行日志轮转就行:

`bash

在/etc/logrotate.d/certbot里加入

/var/log/letsencrypt/*.log {
daily
rotate 7
compress
missingok
notifempty
}
`

顺手说个技巧:如果你有多个子域名比如api.example.com、admin.example.com,别一个个去申请,太累。用通配符证书一劳永逸:

`bash
sudo certbot certonly --manual --preferred-challenges dns -d *.example.com
`

注意这里必须用DNS验证,通配符域名不支持HTTP验证。部署后用openssl命令查查证书对不对:

`bash
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -subject -dates -issuer
`

你会看到证书过期时间。我见过有人配错导致证书过期还在跑,浏览器报大红叉,那场面尴尬极了。

基础配完还能优化性能。从HTTP/1.1升级到HTTP/2之后,页面加载速度肉眼可见地提升了,从慢悠悠变成嗖的一下。具体数字我忘了,但体感变化巨大。配置也简单,在listen指令后加个http2就行。另外有个小东西叫OCSP Stapling,能避免浏览器自己去查证书状态,减少握手时间:

`nginx
server {
listen 443 ssl http2;
# ... 其他配置 ...

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
}

加完这些后用SSL Labs测一下,成绩能从B直接蹦到A+。我第一次测是B,加完后直接A+,那种舒爽的感觉绝了!

(核心配图:SSL Labs测试结果截图,显示A+评分,突出性能优化效果)

遇到问题怎么办?常见的错我基本都踩过:

  • 证书不匹配:浏览器报证书不适用于example.com。多半是你申请的域名和配置里的不一样。检查Nginx的server_name和证书里的域名,别想当然。
  • 权限问题:Nginx启动报错。这基本是证书文件权限搞鬼。确保/etc/letsencrypt/目录权限是755,文件是644,别问为什么,照做就行。
  • 续期失败:certbot报错。多数是ACME challenge路径被防火墙拦了。检查443端口是不是开的:sudo netstat -tlnp | grep 443。
  • 免费方案的话,除了Let’s Encrypt,还有ZeroSSL和Cloudflare的SSL。我真心推荐Let’s Encrypt,生态最成熟,社区最活跃,自动化程度也最高,用着省心。

    (总结前配图:一张表格对比Let’s Encrypt、ZeroSSL、Cloudflare的费用、有效期、自动化支持程度)

    总之折腾下来,感觉SSL证书这事儿核心就是选对类型、配好自动续期。其他的优化锦上添花。希望你别像我一样踩那么多坑。证书部署完记得用SSL Labs测个评分,免费的不用注册。看到A+就踏实了,不然八成配置还有问题。别像我第一次拿个B还自我感觉良好,最后发现是个低级错误。


    *本文仅供参考,不构成医疗建议。*
    *本文由AI辅助创作,仅供参考。*

    滚动至顶部