用了这么多年Let’s Encrypt,最烦的就是看到有人还在手动上传CSR到CA签证书。Let’s Encrypt全自动化,90天续期一次,配合acme.sh或者certbot,写个crontab就能一直跑。
先说前提条件:
– 域名解析到你服务器的IP,A记录或者CNAME都行
– 服务器80或443端口能通(Let’s Encrypt验证域名所有权要用)
– 你有一台能跑bash的Linux机器(雨云的服务器性价比不错,我一直在用,稳定没出过问题)
选哪个工具
certbot是官方推荐,但依赖多,装完一堆Python包。acme.sh纯shell实现,干净,我推荐这个。
安装acme.sh:
curl https://get.acme.sh | sh -s email=your@email.com
或者用git clone:
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m your@email.com
装完重新登录shell,或者source一下:
source ~/.bashrc
申请证书
单域名证书:
acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html
–webroot指定你的网站根目录,acme.sh会在里面放一个验证文件,Let’s Encrypt服务器通过HTTP访问这个文件来确认你拥有域名。
如果你用的Nginx或者Apache,也可以用standalone模式,acme.sh自己起一个临时服务器:
acme.sh --issue -d example.com --standalone
注意standalone模式需要先停掉你的web服务器,因为要占用80端口。或者用–tls用443端口(需要root权限):
acme.sh --issue -d example.com --standalone --tls
配置Web服务器
证书签下来后,默认放在~/.acme.sh/example.com/目录下。但官方明确说不要直接引用这个目录,因为acme.sh可能内部改结构。要用–install-cert把证书复制到目标位置。
Nginx例子:
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"
把nginx配置里加上:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 其他配置...
}
Apache类似,–reloadcmd改成”systemctl reload apache2″或者”httpd -k graceful”。
自动续期
acme.sh装完会自动加crontab,每天早上检查证书是否到期,到期前30天自动续签。检查一下:
crontab -l
应该能看到类似:
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
如果你手动想续期:
acme.sh --renew -d example.com
泛域名证书
如果你有多个子域名,签一个泛域名省事:
acme.sh --issue -d *.example.com --dns dns_cf
这里用到DNS API模式,acme.sh通过DNS服务商的API添加TXT记录来验证。上面例子是Cloudflare,需要设置CF_Email和CF_Token环境变量。其他服务商比如阿里云、腾讯云、DNSPod都支持,具体看acme.sh文档。
export CF_Email="your@email.com"
export CF_Token="your_api_token"
acme.sh --issue -d *.example.com --dns dns_cf
常见问题
1. 验证失败:检查域名解析是否生效,80端口是否被防火墙挡住,webroot路径是否正确。
2. 续期后证书没更新:–reloadcmd没写对,或者nginx reload失败。手动跑一遍acme.sh –renew -d example.com,看输出。
3. 证书路径找不到:acme.sh升级后目录结构可能变。用acme.sh –info -d example.com查看当前证书位置。
4. 雨云的服务器默认安全组可能会拦80端口,去控制台放行一下就行,操作很简单。
迁移到新服务器
直接把~/.acme.sh目录打包过去,在新机器安装acme.sh后,用–import导入已有证书:
acme.sh --import -d example.com --key-file /path/to/key --cert-file /path/to/cert
重新–install-cert配置新服务器的web服务。
说一句:Let’s Encrypt证书有效期90天,自动化续期一定要配好。crontab挂了,一个月后网站打不开,HTTPS报错,用户投诉,运维背锅。这种破事我见过太多次了。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容