Linux SSL证书自动更新管理

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

前言

对于网站而言,SSL加密非常重要,不仅可以加强网站的安全性,而且还能提高网站的SEO,浏览器不会提示用户站点是非安全的。

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.

GitHub项目地址:

一、通过 Certbot 自动更新证书

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

1、CentOS 8 安装 SNAP

dnf -y install epel-release
dnf upgrade
dnf -y install snapd
systemctl enable --now snapd

2、CentOS 7 安装 SNAP

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

yum -y install epel-release yum-plugin-copr

2.2 添加仓库

yum copr enable ngompa/snapcore-el7

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

yum -y install snapd

2.4 安装完成,启用snapd socket

systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap

2.5 查询帮助页面

snap --help

3、更新 SNAP 到最新版本

snap install core
snap refresh core
ln -s /var/lib/snapd/snap /snap

4、使用 SNAP 安装 Certbot

snap install --classic certbot

5、建立 Certbot 的软连接

ln -s /snap/bin/certbot /usr/bin/certbot

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

certbot --nginx

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

7、使用 Certbot 进行自动更新

certbot renew --dry-run

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

1、CentOS 终端下执行:

dnf -y install socat
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m  myemail@example.com

案例

git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install  \
--home ~/myacme \
--config-home ~/myacme/data \
--cert-home  ~/mycerts \
--accountemail  "my@example.com" \
--accountkey  ~/myaccount.key \
--accountconf ~/myaccount.conf \
--useragent  "this is my client."

说明:

  • --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查看当前版本。

[root@VM-0-4-centos ~]# acme.sh -v
https://github.com/acmesh-official/acme.sh
v3.0.0

acme.sh 3.x版本默认使用Let’s Encrypt作为服务提供商,我们可以通过以下命令,将其更换为ZeroSSL:

acme.sh --set-default-ca  --server zerossl

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

三、申请证书

1、通过 HTTP 方式申请证书

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会删除验证文件. 整个过程没有任何副作用.

# 生成 RSA 证书:
acme.sh --issue -d zhiqiang.cloud -w /etc/nginx/conf.d/ssl/
# 生成 ECC 证书:
acme.sh --issue -d zhiqiang.cloud -w /etc/nginx/conf.d/ssl/ --keylength ec-256

/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、配置环境变量

[root@hezhiqiang ~]# export Ali_Key=---------(换成你自己的AccessKey ID)
[root@hezhiqiang ~]# export Ali_Secret=-------(换成你自己的AccessKey Secret)

3、申请证书

# RSA 证书
acme.sh --issue --dns dns_ali -d zhiqiang.cloud  -d *.zhiqiang.cloud
# ECC 证书
acme.sh --issue --dns dns_ali -d zhiqiang,cloud -d *.zhiqiang.cloud --keylength ec-256

申请证书后, key 和 秘钥会被 明文 保存在 ~/.acme.sh/account.conf , 请妥善保管

如果需要重新申请证书: 请删除掉该目录下内容 rm -rf /root/.acme.sh/zhiqiang.cloud/*

腾讯云 DNSPod 申请方式

1、Token可通过:https://console.dnspod.cn/account/token/token# 获取。

export DP_Id="123456"
export DP_Key="abcdefxjhajk"
acme.sh --issue --dns dns_dp -d zhiqiang.cloud -d www.zhiqiang.cloud
  • DP_Id=” ”中请填写您的ID

  • DP_Key=” ”中请填写Token

华为云 DNS 申请方式

export HUAWEICLOUD_Username=<Your Username> # Usually hwxxxxxx
export HUAWEICLOUD_Password=<Your Password>
export HUAWEICLOUD_ProjectID=<A Project ID> 
  • 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官网在线申请SSL证书,免费账户是有3个域的额度限制的,但通过acme.sh申请则没有这个限制,所以建议使用acme.sh进行申请,简单方便。

1、申请ZeroSSL泛域名SSL证书

首次使用需要先注册ZeroSSL账户(参考上一步),如果已经注册,下面的命令会自动关联账户,命令如下(myemail@example.com改成你自己的ZeroSSL邮箱,不要乱填):

acme.sh  --register-account  -m myemail@example.com --server zerossl

zhiqiang.cloud域名为例,该域名使用DNSPod解析,我已经在上一个步骤中设置好DNSPod解析DNS API,现在可以输入命令直接申请:

acme.sh --dns dns_dp --issue -d zhiqiang.cloud -d *.zhiqiang.cloud

2、多域名证书

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

例如:

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

多域名申请证书会将多个证书合并为一个证书,并存放到以第一个域名命名的文件夹内,证书信息仅显示第一个域名的信息.

五、自动部署

如果申请过程中没有报错,就可以将SSL证书拷贝到任何想要的位置进行使用,命令如下:

acme.sh  --installcert  -d  zhiqiang.cloud   \
        --key-file   /data/ssl/zhiqiang.cloud.key \
        --fullchain-file /data/ssl/zhiqiang.cloud.crt

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

六、手动拷贝证书

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

~]# tree /root/.acme.sh/zhiqiang.cloud
/root/.acme.sh/zhiqiang.cloud
├── ca.cer
├── fullchain.cer
├── zhiqiang.cloud.cer
├── zhiqiang.cloud.conf
├── zhiqiang.cloud.csr
├── zhiqiang.cloud.csr.conf
└── zhiqiang.cloud.key

0 directories, 7 files

2、拷贝到 Nginx 目录.

仅供参考,请根据具体的域名进行替换

]# mkdir -p /etc/nginx/conf.d/ssl/zhiqiang.cloud
]# cp ~/.acme.sh/zhiqiang.cloud/* /etc/nginx/conf.d/ssl/zhiqiang.cloud
]# tree /etc/nginx/conf.d/ssl
/etc/nginx/conf.d/ssl
└── zhiqiang.cloud
    ├── ca.cer
    ├── fullchain.cer
    ├── zhiqiang.cloud.cer
    ├── zhiqiang.cloud.conf
    ├── zhiqiang.cloud.csr
    ├── zhiqiang.cloud.csr.conf
    └── zhiqiang.cloud.key

1 directory, 7 files

七、配置证书.

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

1、新建Nginx配置文件

vim /etc/nginx/conf.d/zhiqiang.cloud.conf

2、写入以下内容

server {
    listen 80;                          # 代理端口, 通过此端口重定向到443访问, 不再通过8080端口
    server_name www.zhiqiang.cloud;     # 修改成你的域名或者注释掉,多个域名,以空格分开
    client_max_body_size 100m;          # 文件上传大小限制
    return 301 https://www.zhiqiang.cloud/; # 将 http 重定向 https


    listen 443 ssl;                     # 服务器开启443端口
    server_name www.zhiqiang.cloud;     # 修改成你的域名或者注释掉,多个域名,以空格分开

    ssl_certificate /etc/nginx/conf.d/ssl/zhiqiang.cloud/zhiqiang.cloud.cer;     # crt文件的路径
    ssl_certificate_key /etc/nginx/conf.d/ssl/zhiqiang.cloud/zhiqiang.cloud.key; # key文件的路径

    ssl_session_timeout 5m;              # 缓存有效期
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 安全链接可选的加密协议
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;  # 加密算法
    ssl_prefer_server_ciphers on;        # 使用服务器端的首选算法
    client_max_body_size 100m;           # 文件上传大小限制
    
    }

3、检测Nginx语法

[root@VM-0-4-centos ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

4、启动Nginx进行验证

systemctl restart nginx

八、验证证书配置成功.

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

九、自动更新证书

ZeroSSL 的证书有效期为60天

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

1、强制执行更新任务

acme.sh --cron -f

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

/root/.acme.sh/acme.sh --dns dns_dp --issue -d zhiqiang.cloud -d *.zhiqiang.cloud
cp ~/.acme.sh/zhiqiang.cloud/* /etc/nginx/conf.d/ssl/zhiqiang.cloud
systemctl restart nginx
[root@VM-0-4-centos ~]# chmod +x /root/.acme.sh/auto-udate-ca.sh

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

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

十、acme升级

目前由于 acme 协议和 Let`s CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.

升级 acme.sh 到最新版 :

acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

acme.sh --upgrade --auto-upgrade

之后, acme.sh 就会自动保持更新了.

你也可以随时关闭自动更新:

acme.sh --upgrade --auto-upgrade 0

十一、故障排查

错误一:

解决方案:

查询libssl.so 模块版本

ldconfig -v | grep libssl.so

1. 新增 repo 源

vim /etc/yum.repos.d/city-fan.repo

内容为:

[cityfan]
name=cityfan
baseurl=http://www.city-fan.org/ftp/contrib/yum-repo/rhel8/x86_64/
enabled=1
gpgcheck=0

2. 更新 curl

dnf -y update curl libcurl

其它出错, 请添加 debug log

acme.sh  --issue  .....  --debug 

或者:

acme.sh  --issue  .....  --debug  2

请参考:

本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.

最后更新于