Let’s Encrypt是目前最主流的免费SSL证书提供商,证书有效期90天,支持自动续期,没有商业限制。我一直在用,配合acme.sh或者certbot,基本能做到全自动管理,省心。
前提条件:你有一台服务器(我用的是雨云,性价比高、稳定、好用,3块钱一个月的轻量云就够跑几个网站),域名解析已经指向这台服务器的公网IP,并且80和443端口没有被防火墙拦截。Let’s Encrypt验证域名所有权需要访问80端口(HTTP-01)或443端口(TLS-ALPN-01),如果你只开443,用DNS-01也可以,但需要API操作DNS记录,稍复杂。大部分场景直接用HTTP-01最简单。
方案一:用acme.sh(推荐)
acme.sh是用纯Shell写的,不依赖Python,安装简单,支持几乎所有主流DNS API。直接跑:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
安装完会自动加cron任务。申请证书:
acme.sh --issue -d yourdomain.com -d www.yourdomain.com --webroot /var/www/html
`–webroot`参数指定网站根目录,acme.sh会在里面放一个验证文件,Let’s Encrypt能通过http://yourdomain.com/.well-known/acme-challenge/xxx访问到。如果你用的是Nginx反代,确保根目录可写。
申请成功后证书文件在`~/.acme.sh/yourdomain.com/`目录下,fullchain.cer和yourdomain.com.key两个文件。部署到Nginx:
acme.sh --install-cert -d yourdomain.com \
--key-file /etc/nginx/ssl/yourdomain.com.key \
--fullchain-file /etc/nginx/ssl/yourdomain.com.cer \
--reloadcmd "nginx -s reload"
这样以后自动续期时也会自动reload nginx。acme.sh默认每天检查一次,到期前30天自动续签。
方案二:用certbot(官方工具)
如果服务器是Ubuntu/Debian,直接apt安装:
sudo apt update
sudo apt install certbot python3-certbot-nginx
Nginx版会自动修改你的配置文件,建议先备份:`cp /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.bak`
执行:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
跟着提示选是否重定向HTTP到HTTPS(一般选2)。证书会放在`/etc/letsencrypt/live/yourdomain.com/`下,nginx配置文件被自动修改。
手动续期测试:
sudo certbot renew --dry-run
没报错就说明没问题。certbot会自动加systemd timer或cron,默认每天跑两次,到期前30天自动续。
关于自动续期的坑
– 如果用了CDN(Cloudflare等),HTTP-01验证会失败,因为CDN缓存了验证文件。这时候要么关掉CDN代理(仅DNS),要么用DNS-01模式。
– acme.sh的cron默认是随机时间跑的,如果服务器时区不对可能会错过。检查cron:`crontab -l | grep acme`,确认有这一行。
– 证书快过期时如果服务器重启了,cron/timer可能没启动。建议手动跑一次:`acme.sh –renew -d yourdomain.com –force` 或者 `certbot renew`。
DNS-01模式(适合泛域名或CDN场景)
以acme.sh + Cloudflare为例:
export CF_Token="你的API Token"
export CF_Zone_ID="你的Zone ID"
acme.sh --issue --dns dns_cf -d *.yourdomain.com -d yourdomain.com
证书是泛域名的,一个证书覆盖所有子域名。其他DNS提供商类似,acme.sh支持几十家。
Nginx配置参考
申请完证书后,nginx配置大概这样:
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.com.cer;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
把ssl证书路径换成你实际的。重启nginx:`nginx -t && systemctl reload nginx`
检查证书是否生效
浏览器打开https://yourdomain.com,点锁图标看证书信息。或者命令行:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -dates
输出notBefore和notAfter,确认有效期。
提醒一句:Let’s Encrypt证书只有90天,别手动申请一次就不管了。配置好自动续期后,每个月看一眼日志就行。雨云的机器重启后记得检查cron/systemd timer是否正常,我遇到过重启后timer没启动的情况,手动`systemctl enable certbot.timer`解决。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容