背景
原来用的是腾讯云和阿里云的免费证书,有效期1年;但是最近他们都变更了权益,有效期只有3个月,虽然免费数量上限提高了1倍,证书更新频率确需要提高到4倍,这不能忍,加之之前有了解过acme可以实现自动申请证书和续期,现在可以搞起来了
关于安装部署
这里就不细说了,网上有很多详细的教程,从安装部署到自动续期都能找到很多。但是我没找到适合我的情况的,因为公司用的是nginx多节点,有海外有国内,一般教程的申请证书方式无法适用,还有多nginx节点如何同步证书的问题。
证书申请和申请验证
申请证书最好是走dns验证方式,简单方便,域名解析服务商一般都提供dns api验证方式,只是要考虑下api密钥泄露风险
但是我的情况是只能用http验证方式,以下是我申请证书时遇到的几种情况、问题和应对方式:
1. 域名DNS只解析到一台nginx节点
直接使用acme来进行续期操作,参考大多数教程即可,基本不会卡流程
2. 域名DNS解析到2台以上nginx节点
因为acme申请和续期证书时走的是http验证,证书提供商要来访问域名下/well-known/acme-challenge/路径的验证文件,然而域名又是解析到多台nginx节点,而你是在其中一台nginx节点发起的申请,所以有可能会导致验证过程报404。
但是经过尝试,国内的多nginx节点一般不会存在这个问题,因为证书提供商一般会尝试30次验证请求,30次总会有一次正确到达有验证文件的服务器吧(除非你脸黑或者nginx节点太多而发起申请的节点负载权重很低,所以建议在高权重的nginx节点服务器发起申请)
但但是,如果有境外节点的情况下,用国内的节点发起申请失败的概率会很高,估计是提供商都是海外服务,优先选择了访问最快的那个节点来验证。
处理思路:
- 在境外的域名配置里做转发,拦截/well-known/acme-challenge/的请求重定向到国内
- 用境外的节点发起申请,然后再把证书同步到国内的各个节点
证书文件同步
用的ssh-keygen方式,使某个低权限用户免密的在服务器之前使用scp传输文件;其他的可以试试syncthing,但是最好走自己的中继服务器。
自动实现
用crontab来定时跑文件同步脚本和nginx重启脚本;
建议不要用acme提供的自动续期脚本,自己重写一个,可以往里面加上报功能,每次续期的结果发邮件或者webhook机器人