(一)ACME安装
curl https://get.acme.sh | sh
安装程序会自动做以下操作:
自动把 acme.sh 安装到你的 home 的.acme.sh目录下,即~/.acme.sh/
自动创建一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
(二)更改默认证书
acme.sh --set-default-ca --server letsencrypt
acme被ZeroSSL收购,其默认的证书方式为ZeroSSL,但此证书生成时会携带邮箱,因此更换为letsencrypt。
当然,也可以在生成证书时加一个–server参数来决定生成什么证书
–server letsencrypt
(三)生成证书
使用acme.sh --issue命令生成证书,但生成证书的同时会进行域名的所有权的验证。 acme.sh 有两种方式验证:http 和 dns 验证。
注意:如果需要生成泛域名(*.a.com)的证书,不能使用HTTP认证域名,需要改用DNS认证的方式
http方式需要通过
或配置网站根目录,命令参数为(–webroot /home/wwwroot/mydomain.com/)
或关联服务器的nginx服务,命令参数为(–nginx)
或关联服务器的apache服务,命令参数为(–apache)
或自建虚拟webserver(服务器没有占用80端口),命令参数为(–standalone)
来验证你的域名所有权来完成验证。
本服务器已搭建nginx服务,因此关联即可
acme.sh --issue -d file.a.com -d www.a.com -d img.a.com --nginx
参数解析:
–issue命令参数生成证书
-d定义需要生成证书的域名,如有多个域名需使用多次,以上定了三个域名:file.a.com/www.a.com/img.a.com
三个域名需要配置到nginx中,不一定都配置到同一个server中,所有域名都至少对应一个server,否则无法生成证书
...
server {
listen 80;
server_name file.a.com www.a.com img.a.com;
}
...
如果觉得麻烦可以使用第一种配置网站根目录。或者停止占用80端口的服务,然后通过添加–standalone参数,等生成证书后再启动原来的服务。如果服务器已有80端口的服务,不建议使用自建虚拟webserver,此方式续租时略麻烦需要改造。
dns 验证方式
需要在域名上添加一条 txt 解析记录, 验证域名所有权
方式1:手动添加记录
a. 生成txt解析内容
acme.sh --issue --dns -d mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
以上mydomain.com只是测试域名,如果多个域名,则需多次使用-d配置,如-d www.a.com -d img.a.com
b. 把txt解析添加到域名管理面板中
c. 重新生成证书
acme.sh --renew -d mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
注意,重新生成使用的是renew参数,把生成txt解析内容命令的issue改为renew
方式2:域名提供商api自动解析
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
a. 在域名提供商中,生成你的 api id 和 api key并记录,以dnspod为例
b. 引入api id和key,以dnspod为例
export DP_Id=“1234”
export DP_Key=“sADDsdasdgdsf”
c. 生成证书
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
–dns的配置值也是根据域名提供商来决定
(四)copy/安装 证书
默认生成的证书都放在安装目录下: ~/.acme.sh/,但是不要在web服务器中直接引用目录下的证书文件,也不要手动来拷贝证书文件到具体的web服务器中,手动拷贝会导致之后更新证书流程不能完全自动。
正确方式是使用acme.sh的安装证书命令,acme.sh自动拷贝证书文件到具体目录中,拷贝命令会被记录下来,之后自动更新证书流程也会执行此拷贝步骤,从而实现更新证书流程的完全自动化。
格式例子如下:
acme.sh --install-cert -d xxx \
--cert-file xxx \
--key-file xxx \
--fullchain-file xxx\
--reloadcmd xxx
根据web服务器需要的文件按需引入对应的参数,reloadcmd定义证书更新后重启对应的web服务命令。
以nginx为例:
acme.sh --install-cert -d www.a.com -d img.a.com \
--key-file /etc/nginx/cert_file/key.pem \
--fullchain-file /etc/nginx/cert_file/fullchain.pem \
--reloadcmd "service nginx force-reload"
(五)web服务使用证书
通过上一步安装证书,已经把证书拷贝到目标的目录,接下来就是在web服务中使用证书即可。
以nginx为例:
...
server {
listen 443 ssl;
ssl_certificate /etc/nginx/cert_file/fullchain.pem;
ssl_certificate_key /etc/nginx/cert_file/key.pem;
# ...
}
更新证书
目前证书在 60 天以后会自动更新,你无需任何操作,因为在acme.sh安装时,已经把相关的自动更新程序写入到crontab中,如果想要查看,可以通过以下命令:
crontab -l
输出内容包含一个自动更新程序,大致内容如下:
56 * * * * “/root/.acme.sh”/acme.sh --cron --home “/root/.acme.sh” > /dev/null
停止自动更新(移除域名证书)
acme.sh --remove -d example.com
或者手动在/.acme.sh/目录下删除对应的域名目录,如/.acme.sh/a.com。
升级ACME
acme.sh --upgrade
执行出错怎么办
执行错误,可以查看日志,或者执行命令添加–debug 2参数,开启debug模式
acme.sh --issue … --debug 2
评论区