Linux使用acme.sh给Web网站自动安装免费的SSL证书并自动更新,轻松实现HTTPS全流程


Linux使用acme.sh签发证书全流程

出于安全考虑,现在大部分的网站都已经配置了 SSL 证书,直观的感觉就是现在大部分的网站都是 HTTPS ,而不是 HTTP 了。甚至, Chrome 从 90 版本开始,就已经是默认请求 HTTPS

那么,我们个人在部署网站的时候,如何部署 SSL ,快速实现 HTTPS 呢?方法很多,个人觉得,使用 acme.sh 是一个很不错的工具。

一、acme.sh

1.1、如何安装

#方式一
curl https://get.acme.sh | sh -s email=my@example.com # 换成自己的邮箱
#方式二
# 克隆仓库
git clone https://github.com/acmesh-official/acme.sh.git
# 进入仓库内
cd ./acme.sh
# 运行脚本
./acme.sh --install -m my@example.com # 换成自己的邮箱
#方式三
wget -O -  https://get.acme.sh | sh -s email=my@example.com
#方式四(上述方式存在网络访问问题,可能下载失败,本次使用该方式进行安装)
1、首先从仓库中下载源码
2、将源码通过ssh工具上传到服务器上
3、通过解压之后即可安装方式二的方式进行安装,具体演示如下图所示:

1、首先从仓库中下载源码

image-20250722142522988

2、将源码通过ssh工具上传到服务器上

image-20250722142657400

3、通过解压之后即可安装方式二的方式进行安装

#解压命令
tar -zxvf acme.sh-3.1.1.tar.gz
#进入解压之后的包中
cd acme.sh-3.1.1/
#进行acme的安装
./acme.sh --install -m xxxxxxxx@qq.com
#验证是否安装成功
acme.sh -v
#注意过程中可能遇到的问题:问题1.如果安装完成后提示 -bash: acme.sh: command not found,需要手动执行 source ~/.bashrc
#问题2.-bash: ./acme.sh: Permission denied 解决:添加可执行权限:chmod +x ./acme.sh 验证权限:ls -l ./acme.sh
# 输出中应有 -rwxr-xr-x(x 表示可执行)
#这个命令是要更加linux的版本来的,有的可能会死 source ~/.zshrc
#~/.bashrc	是用户家目录下的 Bash Shell 配置文件,存储个性化设置(每次启动终端时自动加载)
source ~/.bashrc --- ~表示root目录
#这条命令的作用是 查找并显示文件 ~/.bashrc 中包含关键词 acme 的所有行,其实也就是环境变量所包含acme的内容
cat ~/.bashrc |grep acme
#展示的内容为: . "/root/.acme.sh/acme.sh.env"

如图所示:

image-20250722144747860

至此安装acme.sh就已经结束了。

1.2、如何使用acme.sh进行https的证书签发

acme.sh支持多种方法进行部署,不过常用的是两种:

  • HTTP验证: 通过在Web服务器上创建临时文件,让ACME服务器验证域名的控制权。acme.sh 可以自动配置常见的Web服务器,如 Apache 和 Nginx,以便进行 HTTP 验证。我们也可以使用 acme.sh 提供的命令来生成临时文件并在验证完成后进行清理。
  • DNS验证: 通过在DNS服务器上添加相应的 DNS TXT 记录来验证域名所有权。acme.sh 官方提供了多个DNS服务提供商的支持,包括 Cloudflare、GoDaddy、Aliyun 等。其他第三方 DNS 也可以根据ACME协议进行对接,不过大部分的 DNS 服务厂商,其实 acme.sh 都已经支持了。

两个方法都是很快速的方法,从结果上出发,最的区别就是DNS验证可以签署通配域名,也就是签署顶级二级域名后,其顶级二级域名分割出的三级域名都可以使用这个证书。

举个例子: 你为顶级二级域名example.com签署通配域名*.example.com,那么a.example.comb.example.com都可以使用这个通配域名证书。但是,使用 acme.sh 签署通配域名证书,只能使用DNS验证的方式进行签署。

接下来,我们就来分别演示。

HTTP验证签署

acme.sh 其实可以自动 HTTP 验证。也就是你的Web服务器已经配置的情况下,你可以选择 acme.sh 自动修改Web配置并验证;也可以手动自动配置,并使用 acme.sh 进行配置的验证。
本次使用 Nginx 服务器为例, Apache 其实也差不多。

自动配置签署

首先,我们需要确保 Nginx 已经安装,下面将重新进行nginx的安装流程,这里直接使用包管理器进行安装

#对于 CentOS/RHEL 系列
#epel-release 是一个 Extra Packages for Enterprise Linux (EPEL) 仓库的包,它为 RHEL (Red Hat Enterprise Linux)、CentOS 和 Fedora 提供了额外的软件包。EPEL 提供了许多 RHEL/CentOS 官方仓库中没有的软件包,这些软件包通常是社区维护的
sudo yum install epel-release
sudo yum install nginx
#which 命令用于查找当前用户在 PATH 环境变量中配置的目录中可执行程序的完整路径
#它仅在当前 PATH 中查找可执行文件
#只查找可执行文件,它不会查找配置文件、源代码文件或其他相关文件
which nginx 
#whereis 命令用于查找给定命令的可执行文件、源代码文件和手册页的位置
whereis nginx
#启动并启用 Nginx 服务
sudo systemctl start nginx
#设置开机自启
sudo systemctl enable nginx
nginx -v

在配置之前,确保 Nginx 当前的配置是可用的状态

$ nginx -t
nginx: the configuration file /usr/local/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/nginx.conf test is successful

nginx安装完成之后,需要在配置文件中配置所需要申请的域名,这是由于 acme.sh 在尝试获取证书时需要正确找到对应的 Nginx 配置,这样才能进行http请求进行证书的获取

1.确认 Nginx 配置文件是否有相关域名的 server 块,所以需要打开具体的nginx配置文件进行编辑

2.确保你至少有以下配置:如果你要申请的域名证书为ymxl.me

server {
    listen 80;
    listen [::]:80;
    server_name ymxl.me;  # 配置你的域名
    root /var/www/html;  # 默认根目录,或修改为你自己的网站根目录
    index index.html index.htm;
    location / {
        try_files $uri $uri/ =404;
    }
}

3.接下来就可以使用acme.sh进行对应域名的证书获取

acme.sh --issue --nginx -d ymxl.me

如图所示:

image-20250722164752779

配置的原理是怎么样呢?

首先, acme.sh 会检测 Nginx 的配置文件地址。如果你的 Nginx 使用的是主config文件,引入子 config(也就是:include /www/wwwConf/*.conf这样的形式)也是支持的;根据你指定的域名,找到具体的server配置片段所在的文件,将其备份。

之后,修改server配置片段,主要的修改内容就是后续我们手动的配置;修改配置后, acme.sh 会使用Nginx的nginx -t检测配置的合法性,如果不合法,那么直接恢复备份终止脚本。

最后,在server修改完成,并和CA校验成功后;签署 SSL 证书并还原 Nginx 备份。之后如果是 acme.sh 的续签,也是重新运行此过程。

image-20250722165015113

最后我们需要把 SSL 证书安装到网站的 SSL 目录内,方便 Nginx 的配置内开启 SSL ,使用命令

acme.sh --install-cert -d example.com \
--key-file       /etc/nginx/ssl/example.com.key  \
--fullchain-file /etc/nginx/ssl/example.com.pem \
--reloadcmd     "systemctl reload nginx"

解释一下:
命令参数:

  • –install-cert:安装 SSL 证书。
  • -d example.com: 指定要安装证书的域名。
  • –key-file: 指定私钥文件的路径。
  • –fullchain-file: 指定包含证书链的 PEM 文件的路径。
  • –reloadcmd: 指定在安装/更新证书后重新加载Web服务器的命令

然后你的nginx配置证书的路径直接改成如下即可:

ssl_certificate         /etc/nginx/ssl/example.com.pem;
ssl_certificate_key     /etc/nginx/ssl/example.com.key;

DNS验证签署

acme.sh 还可以使用DNS验证签署的方式,支持通配域名,配合 DNS 厂商的 API ,也可以实现自动续期:

image-20250722165454237

从流程图就可以看出来,我们需要 DNS 添加 TXT 验证。 如果是自己添加 DNS 的 TXT 的验证,岂不是和以往差不多么?没错,acme.sh 就是可以通过 DNS 厂商的API,自动添加 TXT 验证,在验证成功后,自动删除添加的 TXT 验证;同理,续期也是一样的。

DNS API KEY

acme.sh 需要使用DNS厂商的 API ,添加 TXT 记录地址,帮助 CA 签发机构验证我们对域名的所有权。而 acme.sh 操作 DNS 厂商的 API ,就需要 API 密钥鉴权。 acme.sh 已经适配了多家DNS厂商的 API,比如: Cloudflare,、DNSPod(腾讯)、Cloudxns, Godadd 等等。

我们就以 DNSpod 为例,看看如何操作。 DNSpod 在 acme.sh 的别名是:dns_dp

image-20250722165723248

登录 DNSpod 的后台地址:https://console.dnspod.cn/

选择API密钥管理:

image-20250722165800889

之后,我们创建一个密钥:

image-20250722165824360

创建好的 ID 和 Token 密钥复制下来

环境变量

acme.sh 会从环境变量内,读取所需要用到的 DNS API 地址。你可以直接临时使用:

export DP_Id="<id>"
export DP_Key="<key>"

只要你在后续使用 acme.sh 的--dns dns_dp前,没有重载环境变量,那么 acme.sh 会把这个环境变量写入~/.acme.sh/account.conf内:

cat ~/.acme.sh/account.conf

image-20250722170124344

当然,我会直接写到环境变量内,其实都一样:

image-20250722170316064

签署证书

我们使用 acme.sh 进行签署和验证:

acme.sh --dns dns_dp --issue -d "example.com" -d "*.example.com"
部署SSL证书
acme.sh --install-cert -d example.com \
--key-file       /etc/nginx/ssl/example.com.key  \
--fullchain-file /etc/nginx/ssl/example.com.pem \
--reloadcmd     "systemctl reload nginx"

文章作者: Liu Yuan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Liu Yuan !
—— 评论区 ——
  目录