Linux SSL证书自动更新管理

博客作者:联系请点击,搬运不易,希望请作者喝咖啡,可以点击联系博客作者

前言

对于网站而言,SSL加密非常重要,不仅可以加强网站的安全性,而且还能提高网站的SEO,浏览器不会提示用户站点是非安全的。
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.
GitHub项目地址:
GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol
GitHub

一、通过 Certbot 自动更新证书

Certbot 是一个免费的开源软件工具,用于在手动管理的网站上自动使用Let's Encrypt证书以启用 HTTPS。

1、CentOS 8 安装 SNAP

1
dnf -y install epel-release
2
dnf upgrade
3
dnf -y install snapd
4
systemctl enable --now snapd
Copied!

2、CentOS 7 安装 SNAP

2.1 通过添加epel存储库并安装copr yum插件开始安装。

1
yum -y install epel-release yum-plugin-copr
Copied!

2.2 添加仓库

1
yum copr enable ngompa/snapcore-el7
Copied!

2.3 添加存储库后,安装snapcore包。

1
yum -y install snapd
Copied!

2.4 安装完成,启用snapd socket

1
systemctl enable --now snapd.socket
2
ln -s /var/lib/snapd/snap /snap
Copied!

2.5 查询帮助页面

1
snap --help
Copied!

3、更新 SNAP 到最新版本

1
snap install core
2
snap refresh core
3
ln -s /var/lib/snapd/snap /snap
Copied!

4、使用 SNAP 安装 Certbot

1
snap install --classic certbot
Copied!

5、建立 Certbot 的软连接

1
ln -s /snap/bin/certbot /usr/bin/certbot
Copied!

6、使用 Certbot获取SSL证书,可以指定 –apache 或者 –nginx, 这两个是最常用的选项,这里使用 Nginx。

1
certbot --nginx
Copied!
创建过程中会询问一些基础的问题,比如说 email、域名等。

7、使用 Certbot 进行自动更新

1
certbot renew --dry-run
Copied!

二、通过 acme.sh 自动更新证书

1、CentOS 终端下执行:

1
dnf -y install socat
2
git clone https://github.com/acmesh-official/acme.sh.git
3
cd acme.sh
4
./acme.sh --install -m [email protected]
Copied!

案例

1
git clone https://github.com/acmesh-official/acme.sh.git
2
cd acme.sh
3
./acme.sh --install \
4
--home ~/myacme \
5
--config-home ~/myacme/data \
6
--cert-home ~/mycerts \
7
--accountemail "[email protected]" \
8
--accountkey ~/myaccount.key \
9
--accountconf ~/myaccount.conf \
10
--useragent "this is my client."
Copied!

说明:

  • --home是一个自定义的安装目录acme.sh。默认情况下,它安装到~/.acme.sh
  • -m,--email 指定账户邮箱,只对'--install'和'--update-account'命令有效。
  • --config-home是一个可写文件夹,acme.sh 将在那里写入所有文件(包括证书/密钥、配置),默认情况下,它在--home
  • --cert-home是一个自定义目录,用于保存您颁发的证书,默认情况下,它保存在--config-home.
  • --accountemail 是用于注册 Let's Encrypt 帐户的电子邮件,您将在此处收到续订通知电子邮件。
  • --accountkey是保存您帐户私钥的文件。默认情况下,它保存在--config-home.
  • --user-agent 是用于发送到 Let's Encrypt 的用户代理标头值。

2、安装完成后,可输入acme.sh -v查看当前版本。

1
[[email protected] ~]# acme.sh -v
2
https://github.com/acmesh-official/acme.sh
3
v3.0.0
Copied!
acme.sh 3.x版本默认使用Let’s Encrypt作为服务提供商,我们可以通过以下命令,将其更换为ZeroSSL:
1
acme.sh --set-default-ca --server zerossl
Copied!

3、输入 acme.sh --help 即可查看 acme.sh 的帮助命令

三、申请证书

1、通过 HTTP 方式申请证书

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会删除验证文件. 整个过程没有任何副作用.
1
# 生成 RSA 证书:
2
acme.sh --issue -d zhiqiang.cloud -w /etc/nginx/conf.d/ssl/
3
# 生成 ECC 证书:
4
acme.sh --issue -d zhiqiang.cloud -w /etc/nginx/conf.d/ssl/ --keylength ec-256
Copied!
/etc/nginx/conf.d/ssl/ zhiqiang.cloud 站点下的证书请求目录。
如果没有安装 web 服务器,acme.sh 也自带一个建议的web服务用于证书申请,前提是需要安装 socat ,80端口没有被占用。使用方法:acme.sh --issue -d zhiqiang,cloud --standalone

2、通过 DNS 方式申请证书

  • 优点:不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证,而且可申请泛域名证书。
  • 缺点:需要配合DNS解析服务商的API使用,否则 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
SSL证书验证可通过DNS验证、文件验证等多种方式,为了方便多个域名申请以及后续证书更新,推荐使用DNS API方式,不过在使用前需要先进行设置。

阿里云 DNS 申请方式

1、打开 https://usercenter.console.aliyun.com/#/manage/ak ,获取 AccessKey IDAccessKey Secret
2、配置环境变量
1
[[email protected] ~]# export Ali_Key=---------(换成你自己的AccessKey ID)
2
[[email protected] ~]# export Ali_Secret=-------(换成你自己的AccessKey Secret)
Copied!
3、申请证书
1
# RSA 证书
2
acme.sh --issue --dns dns_ali -d zhiqiang.cloud -d *.zhiqiang.cloud
3
# ECC 证书
4
acme.sh --issue --dns dns_ali -d zhiqiang,cloud -d *.zhiqiang.cloud --keylength ec-256
Copied!
申请证书后, key 和 秘钥会被 明文 保存在 ~/.acme.sh/account.conf , 请妥善保管
如果需要重新申请证书: 请删除掉该目录下内容 rm -rf /root/.acme.sh/zhiqiang.cloud/*

腾讯云 DNSPod 申请方式

1、Token可通过:https://console.dnspod.cn/account/token/token# 获取。
1
export DP_Id="123456"
2
export DP_Key="abcdefxjhajk"
3
acme.sh --issue --dns dns_dp -d zhiqiang.cloud -d www.zhiqiang.cloud
Copied!
  • DP_Id=” ”中请填写您的ID
  • DP_Key=” ”中请填写Token

华为云 DNS 申请方式

1
export HUAWEICLOUD_Username=<Your Username> # Usually hwxxxxxx
2
export HUAWEICLOUD_Password=<Your Password>
3
export HUAWEICLOUD_ProjectID=<A Project ID>
Copied!
  • HUAWEICLOUD_Username:华为云用户名
  • HUAWEICLOUD_Password:华为云密码
  • HUAWEICLOUD_ProjectID:可通过我的凭据获取
目前支持 DNSPod、CloudXNS、Aliyun、jdcloud、 CloudFlare、 GoDaddy、 Azure、AWS 等国内外大多数主流DNS服务提供商。
查看更多DNS API 使用方式, 请查看 https://github.com/acmesh-official/acme.sh/wiki/dnsapi

四、ZeroSSL使用说明

申请证书之前,建议先在ZeroSSL官方网站:https://zerossl.com/注册账号,方便与acme.sh申请的证书进行绑定于关联。
注意:通过ZeroSSL官网在线申请SSL证书,免费账户是有3个域的额度限制的,但通过acme.sh申请则没有这个限制,所以建议使用acme.sh进行申请,简单方便。

1、申请ZeroSSL泛域名SSL证书

首次使用需要先注册ZeroSSL账户(参考上一步),如果已经注册,下面的命令会自动关联账户,命令如下([email protected]改成你自己的ZeroSSL邮箱,不要乱填):
1
acme.sh --register-account -m [email protected] --server zerossl
Copied!
zhiqiang.cloud域名为例,该域名使用DNSPod解析,我已经在上一个步骤中设置好DNSPod解析DNS API,现在可以输入命令直接申请:
1
acme.sh --dns dns_dp --issue -d zhiqiang.cloud -d *.zhiqiang.cloud
Copied!

2、多域名证书

acme.sh 可以同时申请多个域名.例如拥有域名aaa.com,bbb.com,ccc.com,只需要在命令后加上-d 空格 域名即可

例如:

1
acme.sh --issue --server letsencrypt --dns dns_dp -d aaa.com -d *.aaa.com -d bbb.com -d *.bbb.com -d ccc.com -d *.ccc.com
Copied!
多域名申请证书会将多个证书合并为一个证书,并存放到以第一个域名命名的文件夹内,证书信息仅显示第一个域名的信息.

五、自动部署

如果申请过程中没有报错,就可以将SSL证书拷贝到任何想要的位置进行使用,命令如下:
1
acme.sh --installcert -d zhiqiang.cloud \
2
--key-file /data/ssl/zhiqiang.cloud.key \
3
--fullchain-file /data/ssl/zhiqiang.cloud.crt
Copied!

上述命令将zhiqiang.cloud SSL证书导出到了/data/ssl目录,前提是需要创建相关目录。

六、手动拷贝证书

1、查询域名生成的证书路径.

1
~]# tree /root/.acme.sh/zhiqiang.cloud
2
/root/.acme.sh/zhiqiang.cloud
3
├── ca.cer
4
├── fullchain.cer
5
├── zhiqiang.cloud.cer
6
├── zhiqiang.cloud.conf
7
├── zhiqiang.cloud.csr
8
├── zhiqiang.cloud.csr.conf
9
└── zhiqiang.cloud.key
10
11
0 directories, 7 files
Copied!

2、拷贝到 Nginx 目录.

仅供参考,请根据具体的域名进行替换
1
]# mkdir -p /etc/nginx/conf.d/ssl/zhiqiang.cloud
2
]# cp ~/.acme.sh/zhiqiang.cloud/* /etc/nginx/conf.d/ssl/zhiqiang.cloud
3
]# tree /etc/nginx/conf.d/ssl
4
/etc/nginx/conf.d/ssl
5
└── zhiqiang.cloud
6
├── ca.cer
7
├── fullchain.cer
8
├── zhiqiang.cloud.cer
9
├── zhiqiang.cloud.conf
10
├── zhiqiang.cloud.csr
11
├── zhiqiang.cloud.csr.conf
12
└── zhiqiang.cloud.key
13
14
1 directory, 7 files
Copied!

七、配置证书.

以 CentOS 环境为例, 其他环境未测试,但是应该比较类似.

1、新建Nginx配置文件

1
vim /etc/nginx/conf.d/zhiqiang.cloud.conf
Copied!

2、写入以下内容

1
server {
2
listen 80; # 代理端口, 通过此端口重定向到443访问, 不再通过8080端口
3
server_name www.zhiqiang.cloud; # 修改成你的域名或者注释掉,多个域名,以空格分开
4
client_max_body_size 100m; # 文件上传大小限制
5
return 301 https://www.zhiqiang.cloud/; # 将 http 重定向 https
6
7
8
listen 443 ssl; # 服务器开启443端口
9
server_name www.zhiqiang.cloud; # 修改成你的域名或者注释掉,多个域名,以空格分开
10
11
ssl_certificate /etc/nginx/conf.d/ssl/zhiqiang.cloud/zhiqiang.cloud.cer; # crt文件的路径
12
ssl_certificate_key /etc/nginx/conf.d/ssl/zhiqiang.cloud/zhiqiang.cloud.key; # key文件的路径
13
14
ssl_session_timeout 5m; # 缓存有效期
15
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 安全链接可选的加密协议
16
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 加密算法
17
ssl_prefer_server_ciphers on; # 使用服务器端的首选算法
18
client_max_body_size 100m; # 文件上传大小限制
19
20
}
Copied!

3、检测Nginx语法

1
[[email protected] ~]# nginx -t
2
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3
nginx: configuration file /etc/nginx/nginx.conf test is successful
Copied!

4、启动Nginx进行验证

1
systemctl restart nginx
Copied!

八、验证证书配置成功.

打开浏览器 https://zhiqiang.cloud/ 验证 HTTPS 证书

九、自动更新证书

ZeroSSL 的证书有效期为60天
目前手动添加DNS获取证书的方式无法自动更新,但是使用DNS API的方式进行获取证书可以在 60 天以后会自动更新, 你无需任何操作.

1、强制执行更新任务

1
acme.sh --cron -f
Copied!

2、编写自动配置脚本 vim ~/.acme.sh/auto-udate-ca.sh

1
/root/.acme.sh/acme.sh --dns dns_dp --issue -d zhiqiang.cloud -d *.zhiqiang.cloud
2
cp ~/.acme.sh/zhiqiang.cloud/* /etc/nginx/conf.d/ssl/zhiqiang.cloud
3
systemctl restart nginx
Copied!
1
[[email protected] ~]# chmod +x /root/.acme.sh/auto-udate-ca.sh
Copied!

3、配置每3个月更新一次 vim /etc/crontab

1
* * * */3 * root /root/.acme.sh/auto-udate-ca.sh > /dev/null
Copied!

十、acme升级

目前由于 acme 协议和 Let`s CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
升级 acme.sh 到最新版 :
1
acme.sh --upgrade
Copied!
如果你不想手动升级, 可以开启自动升级:
1
acme.sh --upgrade --auto-upgrade
Copied!
之后, acme.sh 就会自动保持更新了.
你也可以随时关闭自动更新:
1
acme.sh --upgrade --auto-upgrade 0
Copied!

十一、故障排查

错误一:
解决方案:
查询libssl.so 模块版本
1
ldconfig -v | grep libssl.so
Copied!

1. 新增 repo 源

1
vim /etc/yum.repos.d/city-fan.repo
Copied!
内容为:
1
[cityfan]
2
name=cityfan
3
baseurl=http://www.city-fan.org/ftp/contrib/yum-repo/rhel8/x86_64/
4
enabled=1
5
gpgcheck=0
Copied!

2. 更新 curl

1
dnf -y update curl libcurl
Copied!
其它出错, 请添加 debug log
1
acme.sh --issue ..... --debug
Copied!
或者:
1
acme.sh --issue ..... --debug 2
Copied!
请参考:
How to debug acme.sh · acmesh-official/acme.sh Wiki
GitHub
本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.
Home · acmesh-official/acme.sh Wiki
GitHub