前言
从去年开始,这个小博客一直在用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 { |