Let's Encrypt通配符/泛域名SSL证书的申请和配置

一. http方式
http方式需要在你的网站目录下放置一个文件, 以此来验证你的域名所有权,完成验证,只需要指定域名, 并指定域名所在的网站根目录,acme.sh会全自动生成验证文件, 并放到网站的根目录, 然后自动完成验证,该方式较适合独立域名的站点使用

./acme.sh --issue -d devopsing.site -d www.devopsing.site --webroot /var/www/html/blog/

- issueacme.sh脚本用来颁发证书的指令;
- d--domain的简称,其后面须填写已备案的域名;
- w--webroot的简称,其后面须填写网站的根目录。

证书签发成功会有如下输出:
01.png
执行成功,默认生成如下证书:

root@www# ls ~/.acme.sh/devopsing.site/ -l
total 7
-rw-r--r-- 1 root root 1587 Dec 16 12:34 ca.cer
-rw-r--r-- 1 root root 1866 Dec 16 12:34 devopsing.site.cer
-rw-r--r-- 1 root root  642 Dec 16 12:34 devopsing.site.conf
-rw-r--r-- 1 root root 1001 Dec 16 12:33 devopsing.site.csr
-rw-r--r-- 1 root root  232 Dec 16 12:33 devopsing.site.csr.conf
-rw-r--r-- 1 root root 1679 Dec 16 12:33 devopsing.site.key
-rw-r--r-- 1 root root 3453 Dec 16 12:34 fullchain.cer

如果用的Nginx服务器, acme.sh还可以智能的从nginx配置中自动完成验证, 不需要指定网站根目录:

acme.sh --issue -d mydomain.com --nginx

二. dns方式
适合用于生成泛解析证书

优势:不需要任何服务器, 不需要任何公网ip, 只需要dns的解析记录即可完成验证
劣势:如果不同时配置Automatic DNS api,使用这种方式acme.sh将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权`

生成证书记录
注意,第一次执行时使用 --issue,-d 指定需要生成证书的域名

./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

在域名解析中手动添加TXT记录
如果第一次添加该域名,会提示如下信息,需要在DNS解析中添加TXT记录,用作判断你是否拥有域名使用权

[Wed Dec 16 16:04:49 CST 2020] Add the following TXT record:
[Wed Dec 16 16:04:49 CST 2020] Domain: '_acme-challenge.devopsing.site'
[Wed Dec 16 16:04:49 CST 2020] TXT value: '-jEWdpI**************EVh01_a3ywrW426wmppjuDqXOs'
[Wed Dec 16 16:04:49 CST 2020] Please be aware that you prepend _acme-challenge. before your domain
[Wed Dec 16 16:04:49 CST 2020] so the resulting subdomain will be: _acme-challenge.devopsing.site
[Wed Dec 16 16:04:49 CST 2020] Please add the TXT records to the domains, and re-run with --renew.
[Wed Dec 16 16:04:49 CST 2020] Please add '--debug' or '--log' to check more details.
[Wed Dec 16 16:04:49 CST 2020] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

02.png
验证解析生效

user@www:~$ nslookup -q=TXT _acme-challenge.devopsing.site
Server:        127.0.0.53
Address:    127.0.0.53#53
Non-authoritative answer:
_acme-challenge.devopsing.site    text = "-jEWdpI****************1_a3ywrW426wmppjuDqXOs"
Authoritative answers can be found from:

重新生成证书
注意,这里第二次执行是用的是 --renew

./acme.sh --renew -d *.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

三.使用DNS API的模式进行证书申请 (支持自动更新)

dns方式的真正强大之处在于可以使用域名解析商提供的api自动添加txt记录完成验证,acme.sh目前支持cloudflare, dnspod,he, godaddy以及ovh等数十种解析商的自动集成。
支持的API列表及使用方法

https://github.com/acmesh-official/acme.sh/wiki/dnsapi
https://github.com/acmesh-official/acme.sh/wiki/dnsapi2

这里以spaceship DNS API为例:
登录Spaceship后点击导航Launchpad--API管理器--添加API密钥
选择“自定义访问”→ 仅启用:

DNS 记录 - 读取
DNS 记录 - 写入

禁用所有其他权限。然后点击 创建API密钥
复制安全存储密钥(密钥不会再次显示)。

在运行acme.sh脚本之前,您需要提供您的用户名和密钥:

export SPACESHIP_API_KEY='8azEY0VMllj859ZqePH7'
export SPACESHIP_API_SECRET='JkZcYYVvSgwSAOXugXrBZ38nbhcanwiZvYP1MtTu0erI32Vmdxtcxn0tTGGL7SGW'
export SPACESHIP_ROOT_DOMAIN='(可选)<如果自动检测失败,请手动指定根域>'

要颁发证书,请运行:

./acme.sh --issue --dns dns_spaceship -d example.domain.com

查看已安装证书

acme.sh --list

删除证书

acme.sh remove domain.com

使用acme.sh安装证书
上面生成的证书放在了~/.acem.sh/<domain>目录,使用--installcert命令,指定目标位置,可将证书copy到相应的位置

Nginx 示例

acme.sh --installcert -d <domain>.com \
--key-file /etc/nginx/SSL/<domain>.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"

如果要直接加载配置,可以使用service nginx force-reload但是由于nginx的配置可能不尽相同,所以一般选择手动重新加载

注意:Nginx的配置ssl_certificate使用/etc/nginx/ssl/fullchain.cer 而非/etc/nginx/ssl/.cer ,否则SSL Labs测试会报Chain issues Incomplete错误

server {

        listen 443 ssl;
        server_name demo.com;
        ssl on;
        ssl_certificate      /etc/nginx/ssl/fullchain.cer;
        ssl_certificate_key  /etc/nginx/ssl/<domain>.key;
}

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

acme.sh --renew -d example.com --force

注:手动添加DNS获取证书的方式无法自动更新,但是使用DNS API的方式进行获取证书可以在证书有效期后自动更新, 你无需任何操作

强制执行更新任务

acme.sh --cron -f

更新acme.sh
Acme 协议和 Let's Encrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步

手动更新:

acme.sh --upgrade

开启自动更新:

acme.sh --upgrade --auto-upgrade

取消自动更新:

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

删除acme.sh

acme.sh --uninstall