如何使用acme.sh申请 SSL(HTTPS) 泛域名证书并自动续签?最新acme.sh安装证书教程

安装 acme.sh

下载并安装 acme.sh

$ cd ~
$ curl https://get.acme.sh | sh -s email=<youremail@domain.com>

查看是否安装成功

$ acme.sh --version

会输出如下信息:

https://github.com/acmesh-official/acme.sh
v3.0.8

【注】如果出现-bash: acme.sh: command not found,请刷新ssh连接(重新连接服务器再执行)

查看定时任务

acme.sh 安装完成后,会自动创建一条定时任务。

$ crontab -l

能看到如下输出:

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

申请证书

有两种方式,即DNS API和普通方式,强烈推荐DNS API方式。

目前 acme.sh 支持 5 个正式环境 CA,分别是

  • Let’s Encrypt
  • Buypass
  • ZeroSSL
  • SSL.com
  • Google Public CA,

默认使用 ZeroSSL

DNS API 方式

DNS API 方式,简单方便,支持泛域名。

官方文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi

阿里云示例
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_ali

腾讯云示例
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_dp

GoDaddy.com示例
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_gd

1. 创建API KEY

如GoDaddy,地址为 https://developer.godaddy.com/keys/
(Product key,即生产环境)

2. 使用export命令导入API KEY
$ export GD_Key="<key>"
$ export GD_Secret="<secret>"
3. 申请证书

请耐心等待。

$ acme.sh --issue --dns dns_gd -d domain.com -d *.domain.com

安装成功,则出现如下提示:

Your cert is in: /usr/local/nginx/conf/ssl/domain.com_ecc/domain.com.cer
Your cert key is in: /usr/local/nginx/conf/ssl/domain.com_ecc/domain.com.key
The intermediate CA cert is in: /usr/local/nginx/conf/ssl/domain.com_ecc/ca.cer
And the full chain certs is there: /usr/local/nginx/conf/ssl/domain.com_ecc/fullchain.cer
4. 安装证书,并自动同步到nginx对应目录

【注】有时会在nginx配置目录conf创建ssl目录并写入证书,即证书路径/usr/local/nginx/conf/ssl,但有时没创建,若是没创建,则按如下方式安装:

$ acme.sh --installcert -d "domain.com" \
--key-file /usr/local/nginx/conf/ssl/domain.com_ecc/domain.com.key \
--fullchain-file /usr/local/nginx/conf/ssl/domain.com_ecc/fullchain.cer
--reloadcmd "lnmp nginx restart"

【注】对应目录conf/ssl/domain.com_ecc须先创建好,要不然报No such file or directory

acme.sh –installcert命令的作用是安装证书到指定的目录中,并且可选地执行重载命令,以确保新安装的证书立即生效。
-d参数指定要安装证书的域名。如果证书包含通配符域名*.domain.com和非通配符域名domain.com,只需使用一个-d参数即可。

你可能好奇这acme.sh更新证书时它是如何知道应该把证书放在哪里的,实际上,当acme.sh –installcert命令后,会创建一个名为 domain.com.conf(以您的域名为名)的配置文件,其中包含了相关文件的路径信息。这个配置文件通常位于 ~/.acme.sh 目录下。

在这个配置文件中,一般会包含以下信息:
Le_RealKeyPath:指定了私钥文件的路径。
Le_RealFullChainPath:指定了完整证书链文件的路径。
通过保存这些信息,acme.sh 在后续证书续签和更新时就能够正确地找到并覆盖之前安装的证书文件。

普通方式

这种方式不支持泛域名。

1. www域名与顶级域名一个证书
$ acme.sh --issue -d domain.com -d www.domain.com -w /data/wwwroot/domain.com/public

【注】不同程序框架根目录路径可能不同,请正确填写。

2. 单个子域名
$ acme.sh --issue -d upload.domain.com -w /data/wwwroot/domain.com/upload

–issue是 acme.sh 脚本用来颁发证书的指令;
-d是–domain的简称,其后面须填写已备案的域名;
-w是–webroot的简称,其后面须填写网站的根目录。
【注】如果出现No EAB credentials found for ZeroSSL, let’s get on错误信息
解决:https://github.com/acmesh-official/acme.sh/wiki/Change-default-CA-to-ZeroSSL,按照说明注册加上邮箱
【注】如果出现CAA错误提示,请多尝试几次,如果还有问题,给域名做CAA记录看下
标记: 0, 标签: issue, 值: letsencrypt.org, ttl: 默认或1小时

3. 安装证书,并自动同步到nginx对应目录

【注1】对应目录先创建,否则提示目录不存在
【注2】先配置nginx,见最后(不用重启)

顶级域名与www域名

$ acme.sh --installcert -d "domain.com" \
--key-file /usr/local/nginx/conf/cert/domain.com/domain.com.key \
--fullchain-file /usr/local/nginx/conf/cert/domain.com/fullchain.cer
--reloadcmd "lnmp nginx restart"

子域名

$ acme.sh --installcert -d sub.domain.com \
--key-file /usr/local/nginx/conf/cert/sub.domain.com/sub.domain.com.key \
--fullchain-file /usr/local/nginx/conf/cert/sub.domain.com/fullchain.cer \
--reloadcmd "lnmp nginx restart"

查看证书列表

$ acme.sh --list

更新证书

目前 Let’s Encrypt 的证书有效期是90天,时间到了会自动更新,您无需任何操作。
但是,您也可以手动强制续签证书:

$ acme.sh --renew -d domain.com --force

【注】为了确保定时任务能自动续签证书,可以受到调用一次定时任务进行续签:

$ acme.sh --force --cron

nginx配置参考

ssl证书配置的核心部分:

#SSL-BEGIN
#使用 ECC 密钥
ssl_certificate ssl/domain.com_ecc/fullchain.cer;
ssl_certificate_key ssl/domain.com_ecc/domain.com.key;

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
#add_header Strict-Transport-Security "max-age=31536000";
#SSL-END

完整nginx配置:

server {
    server_name www.domain.com domain.com;
    listen 80;
    return 301 https://www.domain.com$request_uri;
}

server {
    server_name domain.com;
    listen 443 ssl http2;

    #SSL-BEGIN SSL相关配置
    #......#
    #SSL-END

    return 301 https://www.domain.com$request_uri;
}

server {
    server_name www.domain.com;
    listen 443 ssl http2;

    #SSL-BEGIN SSL相关配置
    #......#
    #SSL-END

    #......#
}

检测网站的安全级别

完成证书部署后可以通过如下站点检测网站的安全级别:
https://myssl.com
https://www.ssllabs.com

其他:更新、删除及卸载

更新 acme.sh

升级 acme.sh 到最新版:

$ acme.sh --upgrade

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

$ acme.sh --upgrade --auto-upgrade

关闭自动更新:

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

删除证书

$ acme.sh remove <SAN_Domains>

卸载

1. 先执行卸载命令

卸载会删除已经生成的证书、添加的定时监测也会删掉。

$ acme.sh --uninstall
2. 再删除目录
$ rm -rf ~/.acme.sh

 

本文由@大鱼原创发布于今日指点,转载请附带链接。

本文链接:https://www.jinrizhidian.com/tech/2019.html

发表评论