一、背景
最近想给自己的站点都加上HTTPS,以前使用certbot都是给每个域名单独申请证书,比较麻烦,这次升级成泛域名证书,所有同一级域名的站点都可以公用一个证书。刚好也趁此机会把站点的HTTP2.0和TLS1.3都配置上。
二、使用acme.sh申请泛域名证书
1. 创建阿里云RAM角色
泛域名证书的申请,需要配置特定的DNS来验证域名的归属。如果想实现自动化申请、续期,就需要使用DNS Api来配合使用。
acme.sh支持使用阿里云的DNS Api。
进入阿里云控制台,选择云管理——访问控制(RAM访问控制)——身份管理——用户——创建用户
创建成功后会获得这个用户的Key和Secret,需要记录下来,在申请证书时需要。
创建的新用户需要赋予几个权限:
- 管理云解析(DNS)的权限
- 管理公共DNS(PubDNS)的权限
- 管理HTTPDNS的权限
配置好后,就可以继续申请证书的操作了。
2. 安装acme.sh
Note: 官方建议使用root用户安装,也可以使用其他用户,这里以root用户为例
安装 acme.sh ,默认安装位置是 ~/.acme.sh :
1 | curl https://get.acme.sh | sh |
在这一步安装过程中,完成了3个任务:
拷贝sh脚本到~/.acme.sh/
创建alias别名acme.sh=~/.acme.sh/acme.sh
启动定时器,并加入到定时任务
3. 配置阿里云的DNS信息
在终端输入:
1 | export Ali_Key="ali-key" |
这个DNS API信息最终会保存在~/.acme.sh/account.conf
文件中。
4. 申请泛域名证书
在终端输入:
1 | acme.sh --issue --dns dns_ali -d xxx.com -d *.xxx.com --server letsencrypt |
--dns dns_ali
是指使用的阿里云的DNS Api,不同云服务商不一致
--server letsencrypt
是指使用letsencrypt申请证书,不携带参数默认使用的zerossl,我使用默认会报错,更换为letsencrypt可正常申请。
证书申请成功后,默认保存在~/.acme.sh/xxx.com
目录下。
5. 安装证书到指定目录
默认生成的证书都放在安装目录下, 不建议直接通过nginx或apache使用此目录下的证书。正确的使用方法是使用 --install-cert
命令,并指定目标位置,,然后证书文件会被copy到相应的位置。
在nginx的配置文件中创建一个目录用来保存证书,也可以保存在其他位置,看个人使用习惯。
1 | cd /etc/nginx |
安装证书:
1 | acme.sh --install-cert -d xxx.com \ |
上述命令把下发的证书复制到你指定的位置,这样避免你直接从~/.acme.sh/
读取证书,然后重新加载nginx或apache以刷新证书。域名为必需参数,其它参数为可选。
但要注意的是,reloadcmd参数非常重要(reloadcmd后面的参数为重新加载nginx或Apache的命令,可以根据系统的不同作相应修改),即使更新了证书,但是nginx或apache没有重新加载,证书是不是会刷新到服务中去的。
6. 调整nginx配置
修改站点的nginx证书配置,例如:/etc/nginx/conf.d/blog.conf
,把证书更换为刚申请的泛域名证书。
1 | server { |
先执行nginx -t
,验证配置文件是否有问题,确认没有问题后执行systemctl reload nginx
,更新nginx配置。这时候访问页面,查看证书信息就能确认证书是否成功生效。
三、配置HTTP2和TLS1.3
站点的nginx配置全部更新后,就可以配置下HTTP2和TLS1.3了,这个操作比较简单。使用sed命令可以批量操作。
Note:此处修改最好提前备份下配置文件,防止操作异常导致站点访问异常。
1 | sed -i 's/listen 443 ssl;/listen 443 ssl;\ |
先执行nginx -t
,验证配置文件是否有问题,确认没有问题后执行systemctl reload nginx
,更新nginx配置。
访问页面,可在开发者工具的network中查看h2配置是否成功,在security中查看是否开启了TLS1.3。