使用acme.sh获取Let's Encrypt免费数字证书
前言
我之前用的ssl证书买阿里云域名送的免费证书,有效期一年,有效期还剩150天。
但去年底很多云服务厂家调整了规则,新申请的免费证书有效期只有三个月,续费的话不清楚是否也是免费三个月,所谓未雨绸缪,我也要考虑下其它免费证书的方案,比如let’s encrypt。
申请let’s encrypt证书,官方默认推荐certbot的进行证书的自动申请、安装,但使用certbot需要安装snapd,这个方法跳过。
最后我选择了acme.sh,因为网上可以参考的方案比较多,出问题比较容易debug。
参考文章
用acme.sh完成let’s encrypt数字证书的申请、验证、安装,网上已经有非常完善的教程,我参考的主要是这几篇:
基本上按照以上三篇文章中记录的步骤操作,就可以成功搞定。
我碰到的一些坑
网上的教程文章虽然很完善,但我在实际部署的过程中还是碰到了一些bug,这是我写这篇博客的主要原因,做个记录,方便日后debug。
问题一:中国特色的网络问题
在第一步获取acme.sh脚本的时候就碰到了问题,中国特色的网络问题,无论是默认的https://get.acme.sh
还是备用的https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh
都提示无法连接。
这只是个小问题,自行解决即可。
也可以在有代理的电脑上访问以上链接,下载脚本以后用scp上传到服务器,记得chmod +x acme.sh
授权,然后用以下命令执行脚本
./acme.sh --install -m my@example.com
执行完成后记得敲source .bashrc
命令让新建的alias生效。
问题二:验证方式
验证有两个方法,http或者dns。
http方式需要指定网站根目录,我因为是用了一个跳板机(nginx转发请求到另一个机器),网站和nginx并不是在同一个服务器,尝试了许久都没有用http方式验证成功。
后来换用dns验证,我的dns服务器上是aliyun,在获取到aliyun的access key并配置以后,执行以下命令
acme.sh --issue --dns dns_ali -d ruohai.wang -d *.ruohai.wang
这个时候我又碰到了报错:can not find dns api hook for dns_ali
这个报错要临时解决的话倒也简单,红字提醒部分已经给出了方案,就是自己手动增加两个dns解析记录就行了。
验证成功以后,申请证书的流程就可以跑完了,最后成功的提示内容如下:
问题三:证书配置
我用的web服务器是nginx,我们要用的证书文件是就是前两个,fullchain.cer
和ruohai.wang.key
。可以在nginx目录下新建目录放这俩证书。
直接贴出配置文件吧(只保留了ssl有关的部分)
server {
listen 443 ssl;
server_name ruohai.wang;
ssl_certificate /path/to/fullchain.cer;
ssl_certificate_key /path/to/ruohai.wang.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
# 这部分根据自己形况调整
}
}
然后先用nginx -t
测试下配置信息有没有错误,没错误的话就可以重启nginx了。
问题四:acme.sh的crontab定时任务
在第一步acme.sh install
的时候,它会自动添加一个crontab定时任务,用来查询证书是否有更新、自动申请。
本来在完成首次的申请、验证以后就不需要管了,但我的情况是碰到了can not find dns api hook for dns_ali
以后是手动配置dns解析记录的,所以自动任务可能没法成功。不过这事等三个月以后再操心就是,暂时不处理了。