前言
从去年开始,这个小博客一直在用Let’s Encrypt的免费证书。
昨天ACMEv2节点终于正式公布了,所以借着这个时机换了一整套证书配置,具体如下:
- 将证书签发工具从
CertBot更换为acme.sh NS服务商由1984 Hosting更换为Cloudflare- 将
RSA4096的证书更换为ECC384 - 换用通配符证书
从上次写Https配置的文档到现在,已经有很多地方做过变更了。
所以借这个时机,重新来记录一下现在签发证书的整个流程,已备以后查阅。
acme.sh
将CertBot更换acme.sh的主要原因是它支持ECC证书。
我想用ECC证书已经很久了,正好借这个时机换掉。
acme.sh跟CertBot比还有一些其他优点,如:
- 几乎无环境依赖,任意用户都可以安装,无需
root,所有文件都会生成在~下的一个目录里,卸载只需要删掉这个目录即可- 好吧还得删掉
crontab里的任务,不过不删也没啥影响
- 好吧还得删掉
- 带自动更新功能,不用整天手动检查了
- 自动配置
crontab任务来更新证书,无需自己折腾 - 支持
DNS模式,以及自动设置DNS记录来实现全自动更新通过DNS挑战签发的证书(通配符目前只支持DNS挑战)- 没仔细研究
certbot是否支持DNS模式,至少certbot --help没看到相关命令,如果有请回复指正谢谢~
- 没仔细研究
安装acme.sh
参照官网的文档,安装非常简单,只需要执行一条命令即可:
1 | curl https://get.acme.sh | sh |
虽然acme.sh本身无权限要求,但为了之后的证书更新后自动重启Nginx,这时候最好还是用root来安装。
更换 NS 服务商为Cloudflare
由于想签通配符证书,而ACMEv2要求通配符只能用DNS挑战,所以需要一家支持通过API更新DNS记录的NS。
之前用的1984 Hosting翻了半天没找到,大概是不支持。
然后就直接拿acme.sh文档里DNS API支持列表里的第一家Cloudflare来用了。
简单看了下Cloudflare的好处:
- 支持
IPv6,之前那家不支持 - 有
API,可以让证书签发工具自动更新 - 知名度更高,大概会更稳定更快一些吧
更换流程
- 打开Cloudflare 官网,注册(登录)账号
- 点右上角的
+ Add Site,然后一步步照着流程走即可 - 去
Crypto设置,把SSL改为Off,最下面点Disable Universal SSL按钮 - 去
DNS设置,检查之前域名的解析是否都挪过来了,如果没有则需要手动添加(我的自动添加的就少了几个) - 去
DNS设置,禁用所有域名右边的小云彩图标,这个开启时别人是无法解析到你的服务器地址的,只能解析到Cloudflare到CDN服务器
开启 DNS CAA
DNS CAA 可限制你的域名只有特定的证书签发机构可以签发证书,且无权签发的签发机构收到签发证书申请时会给你发邮件提醒
之前那篇文章里说的开启方式其实是错误的,在这里重新写一下:
- 添加
CAA记录,Name为你的根域名,Tag为Allow wildcards and specific hostnames,Value为letsencrypt.org - 添加
CAA记录,Name为你的根域名,Tag为Send violation reports to URL,Value为mailto:你的邮箱 - 添加完毕后可以通过
dig caa 你的域名来验证是否成功,记录值会像这样:1
2cat73.org. 300 IN CAA 0 iodef "mailto:root@cat73.org"
cat73.org. 300 IN CAA 0 issue "letsencrypt.org"
获取 API Key
这一步是为了让acme.sh能自动设置DNS记录来自动更新证书的。
- 打开Cloudflare 官网,登录账号
- 打开个人配置
- 点击下方
API Key中的Global API Key右边的View API Key - 将上一步查询到的
Key保存备用- 注意:就像查看时它告诉你的,像保护你的密码似的保护这个
Key,一定不要泄漏
- 注意:就像查看时它告诉你的,像保护你的密码似的保护这个
签发证书
编写一个shell文件,然后执行它来签发第一次证书:
1 |
|
上面是我用的,用之前记得把-d后面的改成自己的域名,--force是为了在尚未过期的时候强制更新证书(方便改参数测试)
我的博客向来是不考虑旧浏览器兼容的,性能也排在安全之后,所以直接只用一张ec-384的证书,如果你要考虑兼容性,可能需要删掉keylength参数
自动复制证书
acme.sh不建议直接使用~/.acme.sh中的内容,因为其结构随时都可能改变。
因此可以添加两个参数,让acme.sh在证书生成后替你把证书copy出来,如:
1 | --key-file "/etc/nginx/ssl/cat73.org/key.key" \ |
自动重启 Web 服务器
证书签发后,Web 服务器一般不会自动重载证书,这时可以让acme.sh替你自动重启。
只需要添加一个参数,如我的Nginx:
1 | --reloadcmd "/etc/init.d/nginx reload" \ |
自动续期
前面说了,acme.sh会自动配置crontab来自动续签证书,所以就不用为这个操心了。
Nginx 配置
我的nginx.conf中SSL部分的配置
1 | ## |
针对域名的配置(以本博客为例):
1 | server { |