Ryan Shang

生死看淡,不服就干

0%

HTTPS泛域名证书升级并配置HTTP2和TLS1.3

一、背景

最近想给自己的站点都加上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个任务:

  1. 拷贝sh脚本到~/.acme.sh/

  2. 创建alias别名acme.sh=~/.acme.sh/acme.sh

  3. 启动定时器,并加入到定时任务

3. 配置阿里云的DNS信息

在终端输入:

1
2
export Ali_Key="ali-key"
export Ali_Secret="ali-secret"

这个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
2
3
4
cd /etc/nginx
mkdir ca
cd ca
mkdir xxx.com

安装证书:

1
2
3
4
acme.sh --install-cert -d xxx.com \
--key-file /etc/nginx/ca/xxx.com/key.pem \
--fullchain-file /etc/nginx/ca/xxx/cert.pem \
--reloadcmd "service nginx reload"

上述命令把下发的证书复制到你指定的位置,这样避免你直接从~/.acme.sh/读取证书,然后重新加载nginx或apache以刷新证书。域名为必需参数,其它参数为可选。

但要注意的是,reloadcmd参数非常重要(reloadcmd后面的参数为重新加载nginx或Apache的命令,可以根据系统的不同作相应修改),即使更新了证书,但是nginx或apache没有重新加载,证书是不是会刷新到服务中去的。

6. 调整nginx配置

修改站点的nginx证书配置,例如:/etc/nginx/conf.d/blog.conf,把证书更换为刚申请的泛域名证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 443 ssl;
server_name blog.xxx;
charset utf-8;
location / {
root /home/git/blog;
index index.html;
}

ssl_certificate /etc/nginx/ca/xxx.com/cert.pem;
ssl_certificate_key /etc/nginx/ca/xxx.com/key.pem;
...
}

先执行nginx -t,验证配置文件是否有问题,确认没有问题后执行systemctl reload nginx,更新nginx配置。这时候访问页面,查看证书信息就能确认证书是否成功生效。

三、配置HTTP2和TLS1.3

站点的nginx配置全部更新后,就可以配置下HTTP2和TLS1.3了,这个操作比较简单。使用sed命令可以批量操作。

Note:此处修改最好提前备份下配置文件,防止操作异常导致站点访问异常。

1
2
3
4
sed -i 's/listen 443 ssl;/listen 443 ssl;\
http2 on;/' /etc/nginx/conf.d/*.conf # 在listen 443 ssl;这一行的下面增加http2的配置

sed -i 's/ssl_protocols TLSv1 TLSv1.1 TLSv1.2;/ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;' /etc/nginx/conf.d/*.conf # 把配置中的支持协议替换掉,顺便下线了TLS1

先执行nginx -t,验证配置文件是否有问题,确认没有问题后执行systemctl reload nginx,更新nginx配置。

访问页面,可在开发者工具的network中查看h2配置是否成功,在security中查看是否开启了TLS1.3。