我这边虽然用的是BT面板,但其在某次升级之后自动申请SSL证书功能就不好用了,所以一直用的是crontab + acme.sh自行更新证书。
当时的教程在这里:
https://itlanyan.com/use-acme-sh-get-free-cert/
前情提要
不说清楚我之前干了什么,就说不清楚我改了什么。其实都是照着上面的教程搞的,只不过沿用了宝塔的文件结构,相当简单。
安装
curl https://get.acme.sh | sh
acme.sh安装成功后,会自动创建一个cron任务
运行`crontab -l`能够进行查看,`crontab -e`能编辑。
41 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
切换CA到letsencrypt
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
因为我是一切都弄好以后才装的acme.sh,所以是以Webroot 方式申请证书
~/.acme.sh/acme.sh --issue -d 域名 --webroot web 目录
最后要执行一次–install-cert。
~/.acme.sh/acme.sh --install-cert -d 域名 \
--key-file 密钥存放路径(在宝塔nginx配置文件里查找【ssl_certificate_key】) \
--fullchain-file 证书存放路径(在宝塔nginx配置文件里查找【ssl_certificate】) \
--reloadcmd "/etc/init.d/nginx reload" (宝塔要改成这个)
这样之后,crontab 就会每天去检查证书的有效时间,在到期前自动更新证书并安装到指定位置,具体的参数与上面最后两条命令相同。
使用Webroot 有个缺点,就是【-d 域名】这里必须列出每一个具体的域名,比如-d examle.com -d chat.examle.com 需要分别添加,不支持*.examle.com。
偶然看到我的域名服务商namesilo 是可以以DNS API 的方式支持通配符证书更新的。于是按照下面教程的提示,将Webroot 方式改成 namesilo 的DNS API 方式。
http://www.gmloc.me/50.html
因为acme 是会自动记录配置的,所以其实只要改之前的申请那一步的命令就好。
申请一个 namesilo 的 DNS API key
登录namesilo,进入API Manager 选项卡。
右侧页面有两个checkbox 选项:
□ Generate key for read-only access
□ Submitting this form constitutes your acceptance of our API terms of use
坑1:不要勾选“Generate key for read-only access” !!!
注意这个API key 只在这一时刻可见,好好保存好,如果再申请就是新key 了。
(此处可以有截图,但我就是不想放)
使用API key
export Namesilo_Key="你的APIKEY"
想不到吧,我第二个坑踩在这里,而且花了很久才解决。
是这样的,我想,你光export 不行啊,重启以后不就没了嘛,这不行啊,所以自作主张,加了一句
echo ‘export Namesilo_Key=”你的APIKEY”‘ >> ~/.bashrc
第一次不是申请了个只读的key 嘛,放的也是只读的key 。
后来重新申请了key ,嫌修改麻烦,就想反正是重登录才生效,我等一切理顺了再改。
问题就出在这里。acme.sh 也怕出事,对于key 的查找逻辑应该是 source ~/.bashrc >> 使用$Namesilo_Key >>如果没有就用自己上一次存的。
对,它用我自己存的旧key 把我export 的新key 给覆盖掉了。
所以这里正确的做法是只做一次 export Namesilo_Key 就好了,放.bashrc里纯画蛇添足,人家acme会自动记录你的配置,不用担心重启问题。
申请证书
acme.sh --issue \
--dns dns_namesilo \
-d 域名 \
-d '*.域名' \
--ecc \
--force
执行。
这里要说一下为什么readonly 不行。acme 申请证书时要先往DNS里增加一条临时的txt记录,申请结束后再给删掉。
还有个小点,就是acme增加txt记录后,要等这条记录生效。namesilo 这里生效挺慢的,大概要等接近2分钟,所以千万不要以为进程挂了。也可以增加 –dnssleep 参数限制等待时间。
再次配置证书
从Webroot 模式切换到 DNS 模式,不是acme 的常规更新方式,所以不会自动执行配置动作。把上面的安装命令再手动执行一次就好。
~/.acme.sh/acme.sh --install-cert -d 域名 \
--key-file 密钥存放路径(在宝塔nginx配置文件里查找【ssl_certificate_key】) \
--fullchain-file 证书存放路径(在宝塔nginx配置文件里查找【ssl_certificate】) \
--reloadcmd "/etc/init.d/nginx reload" (宝塔要改成这个)
更新Nginx配置
把主域名配置关于SSL部分粘到子域名相同位置,并且子域名照主域名的样子增加
listen 443 ssl http2;
就行了。
其实本来很简单的事,被export坑惨了。











