写这篇笔记是因为每次配SSL都要翻文档,干脆记下来。Let’s Encrypt是目前最方便的免费CA,证书90天有效期,配合acme.sh或者certbot自动续签,基本不用管。
准备工作
一台VPS,域名解析到服务器IP。我用的是雨云的服务器,配置不高但跑个网站够用,性价比不错,稳定没出过问题。系统是Ubuntu 22.04,其他Linux发行版操作类似。
安装acme.sh
acme.sh是纯shell写的ACME客户端,比certbot轻量,支持dns api和webroot模式。我习惯用这个:
curl https://get.acme.sh | sh -s email=你的邮箱@example.com
source ~/.bashrc
安装完会自动添加定时任务,crontab -l能看到每天检查续签的条目。这一步不需要手动配置。
申请证书(HTTP验证)
假设你的网站目录在/var/www/html,nginx或apache已经跑起来,80端口能访问。用webroot模式:
acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html
-d参数可以跟多个域名,用空格分隔。–webroot后面写你的网站根目录。acme.sh会在该目录下创建.well-known/acme-challenge/文件夹,Let’s Encrypt服务器通过HTTP访问这个路径来验证域名所有权。
如果用的是nginx且配置了反向代理,确保location能访问到根目录下的静态文件,否则验证会失败。
申请证书(DNS验证)
如果服务器没开80端口,或者要申请泛域名证书(*.example.com),用DNS API模式。以Cloudflare为例:
export CF_Token="你的Cloudflare API Token"
export CF_Zone_ID="域名对应的Zone ID"
acme.sh --issue -d example.com -d *.example.com --dns dns_cf
其他DNS服务商(Aliyun、DNSPod、AWS Route53)类似,export对应的环境变量就行。这种方式不需要服务器开端口,适合内网或非标准端口的情况。
安装证书到Nginx
申请完证书文件在~/.acme.sh/example.com/目录下。但不要直接引用这个路径,acme.sh建议用–install-cert命令把证书复制到目标位置,这样续签后会自动更新:
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--reloadcmd "nginx -s reload"
先创建目录:mkdir -p /etc/nginx/ssl
nginx配置示例:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
80端口强制跳转HTTPS。ssl_protocols和ciphers按这个写就行,现代浏览器都支持。
续签
acme.sh自动续签,无需手动操作。想确认是否正常,可以手动执行:
acme.sh --renew -d example.com --force
如果安装证书时指定了–reloadcmd,续签后会自动重载nginx。没配的话自己手动重载。
查看证书到期时间:
openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -dates
常见问题
1. 验证失败:检查域名解析是否正确,80端口是否开放,防火墙是否放行。用curl http://example.com/.well-known/acme-challenge/test 测试是否能访问。
2. 证书不自动续签:检查crontab,acme.sh的定时任务是否还在。有时系统迁移会丢失cron任务,重新运行acme.sh –install-cronjob即可。
3. 泛域名证书:只能用DNS验证,不支持HTTP验证。DNS API token权限要确保有修改DNS记录的权限。
4. 多个域名混用:同一个证书可以包含多个域名,包括泛域名和普通域名。比如-d example.com -d *.example.com -d blog.example.com。
5. 证书更新后nginx没生效:检查–reloadcmd是否写对,或者手动systemctl reload nginx。
整个流程下来,核心就是acme.sh –issue加–install-cert两步。配好之后基本不用管,除非换服务器或域名。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容