to be
a problem slover

使用acme.sh生成let’s encrypt泛域名证书

概述

acme.sh 实现了 acme 协议,可以从 let’s encrypt 生成免费的证书。

本文介绍如何使用 acme.sh 生成 let’s encrypt 泛域名 tls 证书。

安装 acme.sh

安装很简单,一个命令:

curl  https://get.acme.sh | sh

普通用户和 root 用户都可以安装使用.
安装过程进行了以下几步:

1). 把 acme.sh 安装到你的 home 目录下:

~/.acme.sh/

并创建 一个 bash 的 alias, 方便你的使用: alias acme.sh=~/.acme.sh/acme.sh

2). 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install

安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议。

一般有两种方式验证: http 和 dns 验证。dns 验证又分手动和自动。

我建议使用 dns 自动验证的方式,方便快捷。

使用方法参考官方文档

支持主流的 dns 服务商,去 dns 服务商申请一个 apikey 即可使用。

我使用的是 dnspod,export apikey 之后,一键生成泛域名证书的命令为

acme.sh --issue --dns dns_dp -d 'liushiming.cn' -d '*.liushiming.cn'

后续手动强制更新加上 --force选项

acme.sh --issue --force --dns dns_dp -d 'liushiming.cn' -d '*.liushiming.cn'

域名注意要加单引号 ,否则因为有*通配符,可能会报错(我使用的是 zsh,报的错为zsh: no matches found: *.liushiming.com

查看证书

证书生成后在.acme.sh/your_domain.com/目录中

安装证书

不要直接使用.acme.sh中的目录作为 nginx 的证书目录,因为这个目录只是acme内部使用的,而且在更新证书时,需要 reload nginx,也要指定 reload 命令

安装证书命令(将liushiming.cn替换成你的域名)

$ acme.sh --installcert -d liushiming.cn \
--key-file       /etc/nginx/ssl/liushiming.cn.key  \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd     "systemctl force-reload nginx"

这命令的作用有两个

  • 将证书文件 copy 到你指定的 nginx 目录中
  • 设置证书文件更新时 nginx reload 命令

执行完命令后查看证书是否被放在指定目录

$ ls /etc/nginx/ssl/

nginx 配置

在 nginx 中配置 tls 证书
nginx/conf.d/wordpress.conf

server {
    listen 80;
    listen [::]:80;
    server_name liushiming.cn www.liushiming.cni 47.107.59.241;
    return 301 https://$server_name$request_uri;
    root /var/www/html/wordpress;
}

server {
    listen 443 ssl;
    server_name liushiming.cn www.liushiming.cn;

    ssl on;
    ssl_certificate      /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key  /etc/nginx/ssl/liushiming.cn.key;

    root /var/www/html/wordpress;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi-php.conf;
        # fastcgi_pass 127.0.0.1:9000;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

ssl_certificate 使用 fullchain.cer ,而非 .cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

证书自动更新

证书有效期为 90 天

每天 0:00 点自动检测所有的证书,如果快过期了,需要更新, 则会自动更新证书。

注意:自动更新证书只是更新了服务上的证书和密钥,如果使用了 cdn,还要手动更新 cdn 的证书,参见下面两节。

cdn 证书配置 – 七牛云

如果网站使用了 cdn,在 cdn 的提供商也需要配置 https,否则就不是全站 https 了,chrome 还是会提示不安全。

我的图片是保存在七牛云的,其他静态文件用阿里云 cdn 加速,所以七牛云/阿里云也需要配置 https 证书。

以七牛云为例 cdn 的 https 配置:

七牛云要求的证书格式是.pem格式的,而 acme 生成的证书是.cer后缀的,需要转换一下

cd ~/.acme.sh/your_domain.com
openssl x509 -in fullchain.cer -out qiniu_fullchain.pem -outform PEM
cat qiniu_fullchain.pem

将打印出来的证书复制贴到七牛云证书内容这栏

证书私钥是无需转换的,直接cat your_domain.com.key获得

证书上传后, 在 ssl 证书管理中就会出现新的证书了

点击部署 cdn

cdn 证书配置 – 阿里云

以阿里云为例,新增或者证书续期时,都需要手动去阿里云更新证书,参见下图,先上传,再点部署:

验证 https

用 chrome 访问网站看到 https 的小锁就说明配置成功


update at 20210818:

这次证书过期了,更新时提示提示使用ZeroSSL,需要先注册

执行一下 acme.sh --register-account -m my@example.com命令就好

$acme.sh --issue --force --dns dns_dp -d 'liushiming.cn' -d '*.liushiming.cn'
[Wed Aug 18 10:36:25 CST 2021] Using CA: https://acme.zerossl.com/v2/DV90
[Wed Aug 18 10:36:25 CST 2021] Create account key ok.
[Wed Aug 18 10:36:25 CST 2021] No EAB credentials found for ZeroSSL, let's get one
[Wed Aug 18 10:36:25 CST 2021] acme.sh is using ZeroSSL as default CA now.
[Wed Aug 18 10:36:25 CST 2021] Please update your account with an email address first.
[Wed Aug 18 10:36:25 CST 2021] acme.sh --register-account -m my@example.com
[Wed Aug 18 10:36:25 CST 2021] See: https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA
[Wed Aug 18 10:36:25 CST 2021] Please add '--debug' or '--log' to check more details.
[Wed Aug 18 10:36:25 CST 2021] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
$acme.sh --register-account -m foo@bar.com
[Wed Aug 18 10:37:15 CST 2021] No EAB credentials found for ZeroSSL, let's get one
[Wed Aug 18 10:37:17 CST 2021] Registering account: https://acme.zerossl.com/v2/DV90
[Wed Aug 18 10:37:20 CST 2021] Registered
[Wed Aug 18 10:37:20 CST 2021] ACCOUNT_THUMBPRINT='S_eMm8mjELB07hGW8aENNHLJ548W_NOmW_1zA9SEM0o'
$acme.sh --issue --force --dns dns_dp -d 'liushiming.cn' -d '*.liushiming.cn'
[Wed Aug 18 10:37:27 CST 2021] Using CA: https://acme.zerossl.com/v2/DV90
[Wed Aug 18 10:37:27 CST 2021] Multi domain='DNS:liushiming.cn,DNS:*.liushiming.cn'
[Wed Aug 18 10:37:27 CST 2021] Getting domain auth token for each domain
[Wed Aug 18 10:37:32 CST 2021] Getting webroot for domain='liushiming.cn'
[Wed Aug 18 10:37:32 CST 2021] Getting webroot for domain='*.liushiming.cn'
[Wed Aug 18 10:37:33 CST 2021] Adding txt value: -bBFPHK6mZUBb2cfUGs9QnwOigFreurFopf-DuLqjeQ for domain:  _acme-challenge.liushiming.cn
[Wed Aug 18 10:37:34 CST 2021] Adding record
[Wed Aug 18 10:37:35 CST 2021] The txt record is added: Success.
[Wed Aug 18 10:37:35 CST 2021] Adding txt value: VXapddNZPsF0KDS3Ovcv0g4AurJSR2bLIkkHnZxpAQU for domain:  _acme-challenge.liushiming.cn
[Wed Aug 18 10:37:35 CST 2021] Adding record
[Wed Aug 18 10:37:35 CST 2021] The txt record is added: Success.
[Wed Aug 18 10:37:35 CST 2021] Let's check each DNS record now. Sleep 20 seconds first.
[Wed Aug 18 10:37:56 CST 2021] You can use '--dnssleep' to disable public dns checks.
[Wed Aug 18 10:37:56 CST 2021] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Wed Aug 18 10:37:57 CST 2021] Checking liushiming.cn for _acme-challenge.liushiming.cn
[Wed Aug 18 10:38:45 CST 2021] Domain liushiming.cn '_acme-challenge.liushiming.cn' success.
[Wed Aug 18 10:38:45 CST 2021] Checking liushiming.cn for _acme-challenge.liushiming.cn
[Wed Aug 18 10:39:34 CST 2021] Domain liushiming.cn '_acme-challenge.liushiming.cn' success.
[Wed Aug 18 10:39:34 CST 2021] All success, let's return
[Wed Aug 18 10:39:34 CST 2021] Verifying: liushiming.cn
[Wed Aug 18 10:39:37 CST 2021] Processing, The CA is processing your order, please just wait. (1/30)
[Wed Aug 18 10:39:40 CST 2021] Success

参考资料

acme wiki
dnsapi 使用说明
Issue Wildcard certificate with zsh failed

赞(2) 打赏
欢迎转载,注明出处:刘世明的博客 » 使用acme.sh生成let’s encrypt泛域名证书

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下作者

支付宝扫一扫打赏

微信扫一扫打赏