^-^
CentOS下使用acme.sh以手动DNS方式申请Let'sEncrypt泛域名SSL证书并以Nginx配置

一、前言

四月份之后各种事情一直忙到毕业,回过头来发现网站的SSL过期了。也就随手记录一下网站更新证书的过程。

1. ACME协议和acme.sh

ACME[1](Automatic Certificate Management Environment 自动证书管理环境)是由Let’s Encrypt组织开发的、用于自动化获取SSL证书的协议。acme.sh[2]是一个实现了ACME协议的unix shell脚本工具,可以使用acme.sh方便地获取SSL证书。

2. Let’s Encrypt

Let’s Encrypt[3]免费、开放、自动化的公益性证书颁发机构,助力各类网站启用 HTTPS,旨在创建一个更安全,更尊重隐私的 Web 环境。

二、 申请并配置SSL

0. 环境说明

  • CentOS 7.8
  • Nginx 1.13.7
  • 需要能够登录到拥有域名的控制面板进行手动添加DNS解析记录

1. 安装acme.sh

1
2
3
4
5
6
#使用以下一行命令安装
curl https://get.acme.sh | sh -s email=my@example.com
#安装完成后可以输入以下命令查看相关信息
acme.sh
#acme安装目录在
~/.acme.sh/

2. 更换证书提供机构

acme.sh默认使用ZeroSSL,这里我们切换用Let’sEncrypt

1
acme.sh --set-default-ca --server letsencrypt

3. 生成证书

使用acme.sh生成证书的方式主要有HTTP和DNS两种。这里使用DNS方式,需要能够登录到拥有域名的控制面板进行手动添加DNS解析记录。

3.1 提交申请
1
2
3
4
5
#首先需要提交申请
#注意参数--dns以DNS的方式申请
acme.sh --issue --dns \
-d wcguo.com -d *.wcguo.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

注意这里用通配符表示的泛域名“*.wcguo.com”不包括“wcguo.com”,所以如果要给wcguo.com也用SSL的话必须额外加上[4]

3.2 手动添加DNS解析记录进行验证

申请的指令执行成功后,会显示两条需要手动添加到DNS中的TXT记录值。登录到自己域名的控制面板手动添加这两条记录值。

其实DNS方式可以用域名解析商提供的API自动添加TXT记录实现自动申请SSL,但是我买的域名这个提供商好像没有提供API。所以只能手动添加了,每三个月都要弄一次稍微有点麻烦。

3.3 生成证书

手动添加完DNS解析后就可以进行验证然后生成证书了。注意这里命令用到的参数是–renew。

1
2
3
4
#生成证书
acme.sh --renew \
-d wcguo.com -d *.wcguo.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

生成成功后控制台会显示一大串内容,默认生成的证书文件都放在安装目录下: ~/.acme.sh/

4. 使用证书

4.1 安装证书

不推荐直接用默认目录里的文件,而是复制到其它地方再使用。

或者直接用--install-cert 命令指定证书的目标位置。

1
2
3
4
5
6
7
#将证书放到指定位置
#此处将cert、key、fullchain三个证书文件分别命名并移动到对应的位置
acme.sh --install-cert \
-d wcguo.com \
--cert-file /path/to/certfile/in/ssl/cert.pem \
--key-file /path/to/keyfile/in/ssl/key.pem \
--fullchain-file /path/to/fullchain/certfile/ssl/fullchain.pem
4.2 使用Nginx配置

Nginx使用到两个证书文件,key-file和fullchain-file。其中Nginx的配置ssl_certificate使用 fullchain的文件作为cert文件。所以可以根据情况得到下面的命令

1
2
3
4
5
6
7
#将证书放到指定位置
#这里将key、fullchain两个证书文件放到了自己指定的/usr/local/nginx/ssl/目录下
#以key、cert命名
acme.sh --install-cert \
-d wcguo.com \
--key-file /usr/local/nginx/ssl/key.pem \
--fullchain-file /usr/local/nginx/ssl/cert.pem

得到证书文件后就可以在Nginx配置文件中进行使用了。这里以https访问www.wcguo.com为例简单展示配置文件片段。

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 443;
server_name www.wcguo.com;

ssl on;
ssl_certificate /usr/local/nginx/ssl/cert.pem;
ssl_certificate_key /usr/local/nginx/ssl/key.pem;

location / {
proxy_pass http://localhost:4000;#hexo
}
}

要配置的主要是下面几个地方

  • 监听443端口:listen 443;
  • 设置开启SSL:ssl on;
  • 指定证书文件位置:ssl_certificate /usr/local/nginx/ssl/cert.pem;
  • 指定证书密钥文件位置:ssl_certificate_key /usr/local/nginx/ssl/key.pem;

配置完成后记得重启Nginx。

1
nginx -s reload

三、参考

[1]ACME协议:https://www.rfc-editor.org/info/rfc8555

[2]acme.sh仓库地址:https://github.com/acmesh-official/acme.sh

[3]Letsencrypt官网:https://letsencrypt.org/

[4]通过 acme.sh 申请 Zero SSL 免费泛域名证书:https://blog.csdn.net/zhangxin09/article/details/125062975

[5]使用 acme.sh 配置自动续签 SSL 证书:https://u.sb/acme-sh-ssl/

[6]Letsencrypt泛域名SSL证书免费申请:https://cloud.tencent.com/developer/article/2142931

[7]【Linux】使用 acme.sh 实现了 acme 协议生成免费的SSL 证书:https://blog.csdn.net/ihero/article/details/136232342

[8]HTTPS之acme.sh申请证书:https://developer.aliyun.com/article/674835

[9]Debian服务器上使用ACME.SH脚本免费获取SSL泛域名证书并启用HTTPS加密:https://www.bilibili.com/read/cv15876438/