PeterPu
发布于 2025-08-12 / 35 阅读
0
0

使用acme 申请免费泛域名证书自动续费

Let's Encrypt是一个非常不错的域名证书机构,致力于普及https,现在早已能够签发泛域名证书(俗称“野卡”),而且还是免费的,要知道其它机构的泛域名证书可贵的很。

下面就简单介绍一下如何申请Let's Encrypt证书。

也可以参考官方说明:https://github.com/Neilpang/acme.sh。

一、安装acme.sh:

在Linux下在线安装脚本,使用以下命令

curl https://get.acme.sh | sh -s email=my@example.com

或者:

wget -O - https://get.acme.sh | sh -s email=my@example.com

或者git安装:

git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com

在这一步安装过程中,完成了3个任务:

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

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

如果没有自动创建别名(执行acme.sh,提示command not found),可以使用以下命令自行创建:

alias acme.sh='/root/.acme.sh/acme.sh'

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

其中定时任务可以通过“crontab -l”命令查看到,若没有,也可以自行添加,定时任务如下:

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

如果不想使用默认安装,可以使用高级方式安装,在此安装方式下,可以指定安装目录等相关内容,具有一定灵活性,具体如下:

git clone --depth 1 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。

--config-home:指定一个可写的文件夹,acme.sh将在其中写入所有文件(包括cert / keys,configs)。 默认情况下,它位于 --home。

--cert-home:指定一个目录,用于保存颁发的证书。 默认情况下,它保存在 --config-home。

--accountemail:指定一个用于注册Let's Encrypt帐户的电子邮箱,通过此电子邮件将收到续订等通知。

--accountkey:指定一个保存您帐户私钥的文件。 默认情况下,这个文件保存在 --config-home。

--accountconf:指定一个帐户配置文件。 默认情况下,这个文件保存在 --config-home。

--user-agent:发送给Let's Encrypt的user-agent请求信息。

从上面可以看出很多默认选项,比如--config-home的路径默认选项是--home,--cert-home的默认路径是--config-home,所以可以充分使用默认选项,这样可以更简单一点。

举个例子,我要将acme.sh安装到/data/myacme目录,并将签发的证书保存到/data/SSL目录,使用如下命令即可:

git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install \
--home /usr/local/acme.sh \
--cert-home /usr/local/acme.sh/certs \
--accountemail "cert@yourmail.com"

注意:现在Let's Encrypt自V3以后,开始使用ZeroSSL的CA证书,在申请域名证书之前需要先注册(详见:https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA),请使用如下 命令:

acme.sh --register-account -m cert@yourmail.com --server zerossl

在未注册时申请域名证书,也会有相应的提示,按提示的命令注册即可。如果是已经注册过的邮箱,直接使用--accountemail参数安装即可,如上面的:--accountemail "cert@yourmail.com",这样后续不会再提示注册。

二、使用dns api 申请证书

开通域名阿里云 dns访问权限可参考

进入阿里云,在左侧栏搜索 “访问控制”,然后来到访问控制界面,如果没有开通,直接开通就OK,

然后在进入用户管理->新建用户(右上角)->管理(新建的用户栏处)->创建accessKey了。创建好accessKey,在用户栏出,点击授权。那么此acesskey,就可以使用了。

创建用户后,用户栏

创建accesskey后,授权,授权项时AliyunDNSFullAccess.

那么就可以使用阿里云的 DNS api 了。

这里以阿里云为例,在阿里云的控制台里找到自己的DNS API,然后使用以下命令导入到acme.sh中:

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

这个DNS API信息会保存在“~/.acme.sh/account.conf”文件中。

2、申请泛域名证书:

导入域名商的DNS API之后就可以使用以下命令,自动解析DNS(通过api给你的域名添加一条txt解析记录),验证通过后就会下发证书:

acme.sh --issue --dns dns_ali -d example.com -d *.example.com

证书申请成功后,默认保存在“~/.acme.sh/example.com”目录下。注意:“dns_ali”表示使用阿里云的DNS API,域名商不同的话此处会不同,请参考上述文档。

三、证书部署

默认生成的证书都放在安装目录下, 不建议直接通过nginx或apache使用此目录下的证书。正确的使用方法是使用 --install-cert 命令,并指定目标位置,,然后证书文件会被copy到相应的位置,例如:

Apache命令如下:

acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 reload"

Nginx命令如下(更新证书后,进入nginx容器里重新加载配置以达到更新证书的目的,同时重启portainer容器):

acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "docker exec nginx nginx -s reload && docker restart portainer"

执行该命令后,命令中的参数将自动保存在~/.acme.sh/example.com目录下的example.com.conf文件里,定时器更新证书的时候实现自动部署。此操作对于Docker、Nginx等服务或应用很有必要,可以在证书更新后,同步更新到服务或应用中,防止继续使用过期的证书。

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

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


评论