acme.sh是一个开源的项目,实现了ACME协议, 可以从let’s encrypt生成免费的证书,配合一些cronjob可以实现自动化的部署证书。
现在的免费证书,需要3个月一刷新,即使是买的证书,一次性买多年,也要一年一更换,acme.sh很好的解决了这个问题。
尝试了一下,把博客移动到了阿里云的ECS里,这里有一个阿里云的云小站 , 99可以搞一个2C2G/40GSSD/3M带宽的ECS还是非常合适的。
安装 acme.sh
以下都以当前域名 tiaobug.com 和 www.tiaobug.com 为例。安装使用root或non-root用户都可以。
1 | curl https://get.acme.sh | sh -s email=i@tiaobug.com # 改成自己的邮箱 |
脚本中间会访问github,如果访问有困难,可以参考用gitee的镜像。
1 | git clone https://gitee.com/neilpang/acme.sh.git |
安装后,会自动增加一个定时任务用于刷新证书。
1 | # crontab -l |
同时,安装过程不会新增和修改任何的系统功能和文件, 所有的修改都在安装目录 ~/.acme.sh/
中,所以删除的时候也就很容易。
验证域名
acme.sh生成证书前,需要验证域名的所有权和服务的可用,它实现了acme协议支持的所有验证协议,支持http文件访问和dns text文本解析验证.
http文件访问验证
这里推荐http文件解析认证,预先nginx里配置一个80服务,让域名可以访问。
1 | # vi /etc/nginx/sites-available/default |
执行验证:
1 | acme.sh --issue -d tiaobug.com -d www.tiaobug.com --webroot /home/tiaobug/web-sites/tiaobug.com/ |
执行完成后,会在webroot目录下生成多个文件
1 | [Thu Oct 17 09:30:36 AM CST 2024] Your cert is in: /root/.acme.sh/tiaobug.com_ecc/tiaobug.com.cer |
acme.sh会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证,完成验证后会删除验证文件,不用担心文件会泄露。
参照文件,acme.sh还提供其他的几个封装好的测试工具,在nginx或apache有直接的验证工作,不过我没有测试过。
1 | acme.sh --issue -d tiaobug.com -d www.tiaobug.com --apache |
如果你还没有运行任何web服务, 80端口是空闲的, 那么acme.sh还能假装自己是一个webserver, 临时侦听80端口, 完成验证。
1 | acme.sh --issue -d tiaobug.com -d www.tiaobug.com --standalone |
DNS text解析验证
如果做完了上面的一步,这一步不需要,两种验证方式选一种就可以了,在aliyun ECS的条件下相对来说http验证更加简单一些。
DNS text解析验证的好处是, 你不需要任何服务器, 不需要任何公网IP, 只需要DNS的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
1 | acme.sh --issue --dns -d tiaobug.com -d www.tiaobug.com --yes-I-know-dns-manual-mode-enough-go-ahead-please |
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:
1 | acme.sh --renew -d tiaobug.com -d www.tiaobug.com --yes-I-know-dns-manual-mode-enough-go-ahead-please |
注意第二次这里用的是 –renew
dns方式的真正强大之处在于可以使用域名解析商提供的api自动添加txt记录完成验证.
acme.sh目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
以dnspod为例, 你需要先登录到dnspod账号, 生成你的api id和api key, 都是免费的. 然后:
1 | export DP_Id="1234" |
证书就会自动生成了. 这里给出的api id和api key会被自动记录下来, 将来你在使用dnspod api的时候, 就不需要再次指定了, 直接生成就好了:
1 | acme.sh --issue -d mydomain2.com --dns dns_dp |
更详细的 api 用法: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md
生成并安装证书
验证成功以后,我们就可以生成证书了:
1 | # mkdir -p /home/tiaobug/ssl/tiaobug.com/ |
这里用的是service nginx force-reload, 不是service nginx reload, reload并不会重新加载证书, 所以用的force-reload。
如果不指定路径–key-file和–fullchain-file,默认生成的证书都放在安装目录下: ~/.acme.sh/, 尽量不要直接使用此目录下的文件。
–install-cert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.
详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
查看已安装证书信息
1 | acme.sh --info -d www.tiaobug.com |
配置nginx,安装证书
在nginx的配置文件增加下面的一段,配置完成, 执行命令nginx -s reload
重启nginx即可.
1 | server { |
ssl_certificate和ssl_certificate_key一定要指向正确的证书文件,cert和key文件不要搞反了。
证书自动更新
目前证书在60天以后会自动更新,无需任何操作,cronjob会代劳,不过按照ACME的尿性,以后肯定还会再次改短,可能会缩短这个自动更新时间, 不过都是自动的, 不用关心.
acme.sh的本身的更新
目前由于acme协议和let’s encrypt CA都在频繁的更新, 因此acme.sh也经常更新以保持同步.
升级 acme.sh 到最新版:
1 | acme.sh --upgrade |
如果你不想手动升级, 可以开启自动升级:
1 | acme.sh --upgrade --auto-upgrade |
之后, acme.sh 就会自动保持更新了.
也可以随时关闭自动更新:
1 | acme.sh --upgrade --auto-upgrade 0 |