nginx的https证书自动续期

nginx的https证书自动续期

本文讲述 nginx 的 https 证书如何自动续期。顺便讲述如何手动续期,如何方便地管理所有域名证书。有很多实现方案,包括收费方案和免费方案,本文采用的是 acme.sh 方案。

1. 安装 acme 客户端

需要将系统环境切换到root用户下执行,否则安装证书时可能会失败。

acme 客户端实际上就是个 shell 脚本,执行如下命令完成安装(若出现网络错误,反复重复直到成功即可)。
curl https://get.acme.sh | sh

若访问如上官方脚本较慢,可以使用如下国内镜像地址curl https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false | sh

[root@iZ2ze7011et12xez70sp3dZ nginx]# curl  https://get.acme.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   775    0   775    0     0    145      0 --:--:--  0:00:05 --:--:--   160
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  201k  100  201k    0     0  18804      0  0:00:10  0:00:10 --:--:-- 19012
[2020年 11月 02日 星期一 16:12:52 CST] Installing from online archive.
[2020年 11月 02日 星期一 16:12:52 CST] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[2020年 11月 02日 星期一 16:13:10 CST] Extracting master.tar.gz
[2020年 11月 02日 星期一 16:13:10 CST] It is recommended to install socat first.
[2020年 11月 02日 星期一 16:13:10 CST] We use socat for standalone server if you use standalone mode.
[2020年 11月 02日 星期一 16:13:10 CST] If you don't use standalone mode, just ignore this warning.
[2020年 11月 02日 星期一 16:13:10 CST] Installing to /root/.acme.sh
[2020年 11月 02日 星期一 16:13:10 CST] Installed to /root/.acme.sh/acme.sh
[2020年 11月 02日 星期一 16:13:10 CST] Installing alias to '/root/.bashrc'
[2020年 11月 02日 星期一 16:13:10 CST] OK, Close and reopen your terminal to start using acme.sh
[2020年 11月 02日 星期一 16:13:10 CST] Installing alias to '/root/.cshrc'
[2020年 11月 02日 星期一 16:13:10 CST] Installing alias to '/root/.tcshrc'
[2020年 11月 02日 星期一 16:13:10 CST] Installing cron job
[2020年 11月 02日 星期一 16:13:10 CST] Good, bash is found, so change the shebang to use bash as preferred.
[2020年 11月 02日 星期一 16:13:10 CST] OK
[2020年 11月 02日 星期一 16:13:10 CST] Install success!
[root@iZ2ze7011et12xez70sp3dZ nginx]#

acme 依赖定时任务, 所以若系统没有安装 cron 服务,安装会失败,并提示您安装 cron 服务。

如上的安装过程中,会:

  • 自动创建目录~/.acme.sh/
    最终的 acme 客户端路径为~/.acme.sh/acme.sh
    执行~/.acme.sh/acme.sh -v, 查看客户端版本
[root@iZ2ze7011et12xez70sp3dZ nginx]# ~/.acme.sh/acme.sh -v
https://github.com/acmesh-official/acme.sh
v2.8.8
[root@iZ2ze7011et12xez70sp3dZ nginx]#
  • 自动创建 alias 别名 acme.sh
    这样在执行脚本/root/.acme.sh/acme.sh 的时候就没必要填写完整路径,只需要执行 acme.sh 即可识别。
[root@iZ2ze7011et12xez70sp3dZ nginx]# alias
alias acme.sh='/root/.acme.sh/acme.sh'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@iZ2ze7011et12xez70sp3dZ nginx]#
  • 自动创建 cronjob 定时任务, 每天定时自动检测所有的证书,如果快过期了,则会自动更新证书。
    执行crontab -l,查看当前的定时任务列表,发现已经被自动增加了 acme 脚本的定时任务。
[root@iZ2ze7011et12xez70sp3dZ nginx]# crontab -l
10 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
[root@iZ2ze7011et12xez70sp3dZ nginx]#

2. 生成证书

证书的验证支持文件验证dns 验证,2 种方式采用其中一种即可。推荐采用 dns 验证,dns 验证的优势如下:

  1. 支持泛域名证书的验证,但是文件验证方式不支持泛域名
  2. 生成证书的操作在机器选择上更灵活,采用 dns 验证可以在任何机器上生成证书,但是采用文件验证就只能在域名所属服务器上生成证书(因为需要指定 nginx 发布根目录)。

注意: 无论采用哪种验证方式,在验证过程中会自动校验http域名是否有效。所以在进入该步骤的前提:您的域名可以通过http正常访问。

2.1 采用文件验证方式生成证书

  1. 采用文件验证方式,会要求指定 web 根目录(acme 会自动在根目录下生成校验文件,然后通过域名访问校验文件,待证书验证完成后自动删除校验文件), 所以采用这种方式生成证书,一般需要在域名所在服务器上操作。
  2. 当然,执行本操作之前,您必须要确保该域名的http服务是可以正常访问的,因为验证过程中会使用http服务做验证。

执行如下命令 ~/.acme.sh/acme.sh --issue -d sofineday.com -d www.sofineday.com --webroot /static-file/blog/

参数的含义:

  • --days 指定使用"--issue "命令时更新证书的天数。默认值为60天。
  • --issue 是 acme.sh 脚本用来颁发证书的指令
  • -d 是--domain 的简称,其后面填写要续期的域名   acme.sh 支持多个域名共用同一个证书。
    如上命令生成的证书可同时用于 sofineday.com 和 www.sofineday.com。
  • -w 是--webroot 的简称,其后面须填写网站的根目录

证书的实际生成过程如下:

root@ff939cf2d477:~# ~/.acme.sh/acme.sh  --issue  -d sofineday.com -d www.sofineday.com  --webroot /static-file/blog/
[Mon Nov  2 09:34:37 UTC 2020] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Mon Nov  2 09:34:37 UTC 2020] Create account key ok.
[Mon Nov  2 09:34:37 UTC 2020] Registering account: https://acme-v02.api.letsencrypt.org/directory
[Mon Nov  2 09:34:39 UTC 2020] Registered
[Mon Nov  2 09:34:39 UTC 2020] ACCOUNT_THUMBPRINT='J2XJiPj7rSQ4wODVXqtkbk5G3j3Jk6fVuw0j2EYNQr8'
[Mon Nov  2 09:34:39 UTC 2020] Creating domain key
[Mon Nov  2 09:34:39 UTC 2020] The domain key is here: /root/.acme.sh/sofineday.com/sofineday.com.key
[Mon Nov  2 09:34:39 UTC 2020] Multi domain='DNS:sofineday.com,DNS:www.sofineday.com'
[Mon Nov  2 09:34:40 UTC 2020] Getting domain auth token for each domain
[Mon Nov  2 09:34:42 UTC 2020] Getting webroot for domain='sofineday.com'
[Mon Nov  2 09:34:42 UTC 2020] Getting webroot for domain='www.sofineday.com'
[Mon Nov  2 09:34:42 UTC 2020] Verifying: sofineday.com
[Mon Nov  2 09:34:46 UTC 2020] Success
[Mon Nov  2 09:34:46 UTC 2020] Verifying: www.sofineday.com
[Mon Nov  2 09:34:50 UTC 2020] Pending
[Mon Nov  2 09:35:35 UTC 2020] Success
[Mon Nov  2 09:35:35 UTC 2020] Verify finished, start to sign.
[Mon Nov  2 09:35:35 UTC 2020] Lets finalize the order.
[Mon Nov  2 09:35:35 UTC 2020] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/101076451/5997675384'
[Mon Nov  2 09:35:36 UTC 2020] Downloading cert.
[Mon Nov  2 09:35:36 UTC 2020] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03a494dee4d14855d98ee65a117330602f7b'
[Mon Nov  2 09:35:37 UTC 2020] Cert success.
-----BEGIN CERTIFICATE-----
MIIFZDCCBEygAwIBAgISA6SU3uTRSFXZjuZaEXMwYC97MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDExMDIwODM1MzZaFw0y
MTAxMzEwODM1MzZaMBgxFjAUBgNVBAMTDXNvZmluZWRheS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs+qLKD9XM+HZ9s9rFNnoN+6s/+NAgbD4A
N7J2v2x19EGI68V+3p4PfJ9mC/hyPGOE/S09Is+h3gI1q5G9ePExbeImUnuhTfid
9IOq9wf26EmqGj0Q2wXxP5QQf1kBQvweX/bel5xun9s8UdqDhOQnDEFhWRue4DHB
Fmdme7bl0dtSeuVM7AOTW9obUA2tz4h6zWPJY4vXTNcrnBst3CCzDOV3vivIO08z
CqCapQGJleQTUM+OQNJ63vM63vA2YH1HmQx0h2HTrlCa4RcGaCudUO8p1uBjsi5N
Da74KJHn8uAAKiGmNVxH3UfHptipj83tDl/gVYc8ImsxNcZkDQxZAgMBAAGjggJ0
MIICcDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFIkCvyI57dP+OAsBKxndWaiV8IYQ
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wKwYDVR0RBCQwIoINc29maW5lZGF5LmNvbYIRd3d3LnNvZmluZWRheS5jb20w
TAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcC
ARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEDBgorBgEEAdZ5AgQCBIH0
BIHxAO8AdgBvU3asMfAxGdiZAKRRFf93FRwR2QLBACkGjbIImjfZEwAAAXWIT9xE
AAAEAwBHMEUCIC8k9sHNJLRPehn8rXklLCqPeH4xAfvhBF5SgLAmurIvAiEA0Csc
tInX7h/WYncMNZArhZbzW0CWDGe5XaORBul36gAAdQD2XJQv0XcwIhRUGAgwlFaO
400TGTO/3wwvIAvMTvFk4wAAAXWIT9wkAAAEAwBGMEQCIGQ6tViJ6Vy5ZUjTVLpg
jynJ+faFUtTU+O1izPw3cvldAiB0J3OxmXMr8h3KdqmDFhJxSqa+hYd7TV4SkkEH
nt3BjzANBgkqhkiG9w0BAQsFAAOCAQEAbEoKns5FpQj5VgxoYlS+StnJS/db5wnc
6hnZ3Rya0X8huuOeprtWpFEH3qMIrCmXSsWJLmUaaJKRIAhTqRPsoLXf/HxT4IW2
9xrW435RKxisSfD4EJ4pybbNunHFms+FjJY+m5a3ojDjpErz8FVSeo88811yXNBz
rfv5Pyt6s+0gFg0gO8wB6SWbsNPGA0HvhBmlo8mVOr2l2jNuH0uIRROKgZXvK/V1
+bxpWUwAo5p/CSjFqWc7P/BPM3VQ/gHlkcpH37PWJDB+vzZkYzhuDc9hvxxR2/56
86mbiykVKVvpK91imQy7sD0L1Rpv1kDNHhoBY5l3XBcr6gdv5STrpw==
-----END CERTIFICATE-----
[Mon Nov  2 09:35:37 UTC 2020] Your cert is in  /root/.acme.sh/sofineday.com/sofineday.com.cer
[Mon Nov  2 09:35:37 UTC 2020] Your cert key is in  /root/.acme.sh/sofineday.com/sofineday.com.key
[Mon Nov  2 09:35:37 UTC 2020] The intermediate CA cert is in  /root/.acme.sh/sofineday.com/ca.cer
[Mon Nov  2 09:35:37 UTC 2020] And the full chain certs is there:  /root/.acme.sh/sofineday.com/fullchain.cer
root@ff939cf2d477:~#

从以上生成过程可以看出,证书的生成位置为/root/.acme.sh/sofineday.com/目录。

root@ff939cf2d477:~# ls -l /root/.acme.sh/sofineday.com/
total 28
-rw-r--r-- 1 root root 1648 Nov  2 09:35 ca.cer
-rw-r--r-- 1 root root 3579 Nov  2 09:35 fullchain.cer
-rw-r--r-- 1 root root 1931 Nov  2 09:35 sofineday.com.cer
-rw-r--r-- 1 root root  639 Nov  2 09:35 sofineday.com.conf
-rw-r--r-- 1 root root  997 Nov  2 09:34 sofineday.com.csr
-rw-r--r-- 1 root root  230 Nov  2 09:34 sofineday.com.csr.conf
-rw-r--r-- 1 root root 1679 Nov  2 09:34 sofineday.com.key
root@ff939cf2d477:~#

2.2 采用dns 验证方式生成证书

2.2.1 配置 DNS 提供商的DNS API key

本文以阿里云为例

  1. 登录阿里云后台,进入个人中心的访问控制模块
  2. 创建 dns api key
    • 安全起见,我们专门为当前 api 业务创建一个子用户,注意勾选编程访问
      aliyun 创建子用户
    • 复制AccessKey IDAccessKey Secret
      这 2 个值会在后面步骤用到
    • 为子用户添加权限 AliyunDNSFullAccess

2.2.2 配置系统环境变量

定义如下 2 个环境变量,变量值替换为上一步中从阿里云后台获取的 dns api key。

export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"

2.2.3 生成证书

执行如下命令,生成证书。将参数替换为实际值即可。

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

执行过程如下:

[root@iZ2ze7011et12xez70sp3dZ nginx]# acme.sh --issue --dns dns_ali -d sofineday.com -d *.sofineday.com
[2020年 11月 03日 星期二 10:29:00 CST] Domains have changed.
[2020年 11月 03日 星期二 10:29:00 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2020年 11月 03日 星期二 10:29:00 CST] Multi domain='DNS:sofineday.com,DNS:*.sofineday.com'
[2020年 11月 03日 星期二 10:29:00 CST] Getting domain auth token for each domain
[2020年 11月 03日 星期二 10:29:05 CST] Getting webroot for domain='sofineday.com'
[2020年 11月 03日 星期二 10:29:05 CST] Getting webroot for domain='*.sofineday.com'
[2020年 11月 03日 星期二 10:29:05 CST] Adding txt value: D2YeIt9SuAvgUgBxot6qX6ezcwG8-Dv7eaNQY96fDow for domain:  _acme-challenge.sofineday.com
[2020年 11月 03日 星期二 10:29:07 CST] The txt record is added: Success.
[2020年 11月 03日 星期二 10:29:07 CST] Let's check each DNS record now. Sleep 20 seconds first.
[2020年 11月 03日 星期二 10:29:28 CST] Checking sofineday.com for _acme-challenge.sofineday.com
[2020年 11月 03日 星期二 10:29:31 CST] Domain sofineday.com '_acme-challenge.sofineday.com' success.
[2020年 11月 03日 星期二 10:29:31 CST] All success, let's return
[2020年 11月 03日 星期二 10:29:31 CST] sofineday.com is already verified, skip dns-01.
[2020年 11月 03日 星期二 10:29:31 CST] Verifying: *.sofineday.com
[2020年 11月 03日 星期二 10:29:35 CST] Success
[2020年 11月 03日 星期二 10:29:35 CST] Removing DNS records.
[2020年 11月 03日 星期二 10:29:35 CST] Removing txt: D2YeIt9SuAvgUgBxot6qX6ezcwG8-Dv7eaNQY96fDow for domain: _acme-challenge.sofineday.com
[2020年 11月 03日 星期二 10:29:39 CST] Removed: Success
[2020年 11月 03日 星期二 10:29:39 CST] Verify finished, start to sign.
[2020年 11月 03日 星期二 10:29:39 CST] Lets finalize the order.
[2020年 11月 03日 星期二 10:29:39 CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/101071293/6009613602'
[2020年 11月 03日 星期二 10:29:40 CST] Downloading cert.
[2020年 11月 03日 星期二 10:29:40 CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/0307b969bcc3e239c2974cbc9497b1d42730'
[2020年 11月 03日 星期二 10:29:41 CST] Cert success.
-----BEGIN CERTIFICATE-----
MIIFYzCCBEugAwIBAgISAwe5abzD4jnCl0y8lJex1CcwMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDExMDMwMTI5NDBaFw0y
MTAyMDEwMTI5NDBaMBgxFjAUBgNVBAMTDXNvZmluZWRheS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfAdIati/JZFCEMmTXD4j2UgOwKbKynjHk
ghcW0wA+YyNvIW/Y/kmN4fMk3qEslG6l/XXZ0Lv1IYYStRY70BlUUsHsJ/K/Mu0O
+EFcCBOfggOoZ8J6RCP1tU/erTq2JJTiWNmlQSqCq92SyJJvVdYYOBRrlMuxtBba
8pPLjcpxeSO4iEqlNJh+VJNJE1Loh3X77zRBkLwlsetcI/DwKEn670M01l61XMG1
QMX8RRkp+O4J8Hy6SJlEFv1a320pZJ9IA5D3x8YpgvKJzb5043aN0gPBJ37MVtJq
Mw4NBh9gLk8JKNgbNgJPkJypggLXmGYiLLaFIZEPcoDtjF+xdQ+1AgMBAAGjggJz
MIICbzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFORKHDj/oRKs5nweoobwEffhV0T0
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wKQYDVR0RBCIwIIIPKi5zb2ZpbmVkYXkuY29tgg1zb2ZpbmVkYXkuY29tMEwG
A1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEW
Gmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBAYKKwYBBAHWeQIEAgSB9QSB
8gDwAHYAXNxDkv7mq0VEsV6a1FbmEDf71fpH3KFzlLJe5vbHDsoAAAF1i/BDCgAA
BAMARzBFAiEA/4/3aI6i8hDRexD0lmhMTnEPZzp3+dIaEhRtNZiSetsCIBdqdotF
yfi5uj3bcSBoJHfTUgAYLCTGJX4zJSB34rQgAHYA9lyUL9F3MCIUVBgIMJRWjuNN
Exkzv98MLyALzE7xZOMAAAF1i/BDCgAABAMARzBFAiEA3RVYNLqFuEy985akbyOV
ICG2ztPbZpWUPZYymjRABxkCIGi3cqZkBOAuZUmS2U/8Qd27vlOQpL4XgMmM/24T
qwjrMA0GCSqGSIb3DQEBCwUAA4IBAQBMkWf9jdxzdXc1G1ZE9lJELAsSDjbS79Dv
5fgz2E/EkFaEoPKVUWGMco3j6N1zfhqBOgwXEZdl1HPa+F4RRaCRh2cjodFzm0Xe
r9lE9H95ZhePfYuiMWEibIV6jDOWJBqqOjml9pvQXpFdnqIiwAZ6Bj5GiM6ggiZu
GswmpY/bzwj9YLf9f5VJbRSD4dLm28GRrJGL8sezPZUON44F3I9NbB01JIFPGYkf
8rhwJFcdEg00micTjsdb21/JaRaG9WBcXCjuGF+3z7rsIvK4ZxltkNqUmvD+c44W
DleXTCzniMPbjugvDF+T1wf1mGM9MsBmuuTGLAPvCLjvYTKOtW48
-----END CERTIFICATE-----
[2020年 11月 03日 星期二 10:29:41 CST] Your cert is in  /root/.acme.sh/sofineday.com/sofineday.com.cer
[2020年 11月 03日 星期二 10:29:41 CST] Your cert key is in  /root/.acme.sh/sofineday.com/sofineday.com.key
[2020年 11月 03日 星期二 10:29:41 CST] The intermediate CA cert is in  /root/.acme.sh/sofineday.com/ca.cer
[2020年 11月 03日 星期二 10:29:41 CST] And the full chain certs is there:  /root/.acme.sh/sofineday.com/fullchain.cer
[root@iZ2ze7011et12xez70sp3dZ nginx]#
[root@iZ2ze7011et12xez70sp3dZ nginx]# acme.sh --list
Main_Domain    KeyLength  SAN_Domains      CA               Created                               Renew
sofineday.com  ""         *.sofineday.com  LetsEncrypt.org  2020年 11月 03日 星期二 02:29:41 UTC  2021年 01月 02日 星期六 02:29:41 UTC
[root@iZ2ze7011et12xez70sp3dZ nginx]#

默认 acme.sh 会在证书生成 60 天后执行续期(您可以通过 acme.sh --list 输出的 Created 和 Renew 列看出)。若想对该值做自定义,指定--days 参数即可,如: acme.sh --issue --dns dns_ali -d sofineday.com -d \*.sofineday.com --days 90

2.3 选择CA服务器

当前最新版本的acme.sh,默认情况下使用的CA服务器是zerossl,那么在”生成证书命令“可能会执行失败,那么可以选择其他CA服务器。

acme.sh支持4个CA服务器,分别是 Let's Encrypt、Buypass、ZeroSSL 和 SSL.com,默认使用 ZeroSSL。
对应的设置命令如下:

acme.sh --set-default-ca --server letsencrypt
acme.sh --set-default-ca --server buypass
acme.sh --set-default-ca --server zerossl

示例如下:

root@VM-0-6-ubuntu:~# acme.sh --issue --dns dns_ali -d sofineday.com -d *.sofineday.com
[Sat 09 Apr 2022 09:00:22 PM CST] Using CA: https://acme.zerossl.com/v2/DV90
[Sat 09 Apr 2022 09:00:22 PM CST] Multi domain='DNS:sofineday.com,DNS:*.sofineday.com'
[Sat 09 Apr 2022 09:00:22 PM CST] Getting domain auth token for each domain
[Sat 09 Apr 2022 09:01:03 PM CST] Getting webroot for domain='sofineday.com'
[Sat 09 Apr 2022 09:01:03 PM CST] Getting webroot for domain='*.sofineday.com'
[Sat 09 Apr 2022 09:01:03 PM CST] Adding txt value: uart28HH2nrmXvUHuanWanlUcwQdijubkD2tBlvtBWM for domain:  _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:01:05 PM CST] The txt record is added: Success.
[Sat 09 Apr 2022 09:01:05 PM CST] Adding txt value: 8vauPgEuUjFL124BNSG1-gqSzXtyKKKsa8uO19gICpA for domain:  _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:01:07 PM CST] The txt record is added: Success.
[Sat 09 Apr 2022 09:01:07 PM CST] Let's check each DNS record now. Sleep 20 seconds first.
[Sat 09 Apr 2022 09:01:28 PM CST] You can use '--dnssleep' to disable public dns checks.
[Sat 09 Apr 2022 09:01:28 PM CST] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Sat 09 Apr 2022 09:01:28 PM CST] Checking sofineday.com for _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:01:31 PM CST] Domain sofineday.com '_acme-challenge.sofineday.com' success.
[Sat 09 Apr 2022 09:01:31 PM CST] Checking sofineday.com for _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:01:33 PM CST] Domain sofineday.com '_acme-challenge.sofineday.com' success.
[Sat 09 Apr 2022 09:01:33 PM CST] All success, let's return
[Sat 09 Apr 2022 09:01:33 PM CST] Verifying: sofineday.com
[Sat 09 Apr 2022 09:01:38 PM CST] Processing, The CA is processing your order, please just wait. (1/30)
[Sat 09 Apr 2022 09:01:50 PM CST] Success
[Sat 09 Apr 2022 09:01:50 PM CST] Verifying: *.sofineday.com
[Sat 09 Apr 2022 09:01:59 PM CST] Processing, The CA is processing your order, please just wait. (1/30)
[Sat 09 Apr 2022 09:02:15 PM CST] Success
[Sat 09 Apr 2022 09:02:15 PM CST] Removing DNS records.
[Sat 09 Apr 2022 09:02:15 PM CST] Removing txt: uart28HH2nrmXvUHuanWanlUcwQdijubkD2tBlvtBWM for domain: _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:02:18 PM CST] Removed: Success
[Sat 09 Apr 2022 09:02:18 PM CST] Removing txt: 8vauPgEuUjFL124BNSG1-gqSzXtyKKKsa8uO19gICpA for domain: _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:02:20 PM CST] Removed: Success
[Sat 09 Apr 2022 09:02:20 PM CST] Verify finished, start to sign.
[Sat 09 Apr 2022 09:02:20 PM CST] Lets finalize the order.
[Sat 09 Apr 2022 09:02:20 PM CST] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/9P4RbhWgIVoaIPvAuCh5zw/finalize'
[Sat 09 Apr 2022 09:02:27 PM CST] Order status is processing, lets sleep and retry.
[Sat 09 Apr 2022 09:02:27 PM CST] Retry after: 15
[Sat 09 Apr 2022 09:02:43 PM CST] Polling order status: https://acme.zerossl.com/v2/DV90/order/9P4RbhWgIVoaIPvAuCh5zw
[Sat 09 Apr 2022 09:02:50 PM CST] Order status is processing, lets sleep and retry.
[Sat 09 Apr 2022 09:14:06 PM CST] Polling order status: https://acme.zerossl.com/v2/DV90/order/9P4RbhWgIVoaIPvAuCh5zw
[Sat 09 Apr 2022 09:14:16 PM CST] Sign failed, can not get Le_LinkCert, retry time limit.
[Sat 09 Apr 2022 09:14:16 PM CST] {"status":"processing","expires":"2022-07-08T13:00:44Z","identifiers":[{"type":"dns","value":"sofineday.com"},{"type":"dns","value":"*.sofineday.com"}],"authorizations":["https://acme.zerossl.com/v2/DV90/authz/uNHGSChx4Y0zPX0-CjoPqQ","https://acme.zerossl.com/v2/DV90/authz/ArKxq9XJFIex2A675unajg"],"finalize":"https://acme.zerossl.com/v2/DV90/order/9P4RbhWgIVoaIPvAuCh5zw/finalize"}
[Sat 09 Apr 2022 09:14:16 PM CST] Please add '--debug' or '--log' to check more details.
[Sat 09 Apr 2022 09:14:16 PM CST] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
root@VM-0-6-ubuntu:~#
root@VM-0-6-ubuntu:~#
root@VM-0-6-ubuntu:~# acme.sh --issue --dns dns_ali -d sofineday.com -d *.sofineday.com --server letsencrypt
[Sat 09 Apr 2022 09:17:44 PM CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Sat 09 Apr 2022 09:17:44 PM CST] Create account key ok.
[Sat 09 Apr 2022 09:17:44 PM CST] Registering account: https://acme-v02.api.letsencrypt.org/directory
[Sat 09 Apr 2022 09:17:51 PM CST] Registered
[Sat 09 Apr 2022 09:17:51 PM CST] ACCOUNT_THUMBPRINT='Vqg9KL25_J013ZSP2sjqGyWV1iQ9pTEml2LbJ5XtlpA'
[Sat 09 Apr 2022 09:17:51 PM CST] Multi domain='DNS:sofineday.com,DNS:*.sofineday.com'
[Sat 09 Apr 2022 09:17:51 PM CST] Getting domain auth token for each domain
[Sat 09 Apr 2022 09:17:55 PM CST] Getting webroot for domain='sofineday.com'
[Sat 09 Apr 2022 09:17:55 PM CST] Getting webroot for domain='*.sofineday.com'
[Sat 09 Apr 2022 09:17:55 PM CST] Adding txt value: J6Fijfd78wgVKOqQ9AZzhMzlq60WwCeuHCXxr0ao80I for domain:  _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:17:58 PM CST] The txt record is added: Success.
[Sat 09 Apr 2022 09:17:58 PM CST] Adding txt value: vl7Dmv3I3K83yeVwUQUg6l9SGpzhj0c06W87cyhwdhc for domain:  _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:17:59 PM CST] The txt record is added: Success.
[Sat 09 Apr 2022 09:17:59 PM CST] Let's check each DNS record now. Sleep 20 seconds first.
[Sat 09 Apr 2022 09:18:21 PM CST] You can use '--dnssleep' to disable public dns checks.
[Sat 09 Apr 2022 09:18:21 PM CST] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Sat 09 Apr 2022 09:18:21 PM CST] Checking sofineday.com for _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:18:22 PM CST] Domain sofineday.com '_acme-challenge.sofineday.com' success.
[Sat 09 Apr 2022 09:18:22 PM CST] Checking sofineday.com for _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:18:24 PM CST] Domain sofineday.com '_acme-challenge.sofineday.com' success.
[Sat 09 Apr 2022 09:18:24 PM CST] All success, let's return
[Sat 09 Apr 2022 09:18:24 PM CST] Verifying: sofineday.com
[Sat 09 Apr 2022 09:18:24 PM CST] Pending, The CA is processing your order, please just wait. (1/30)
[Sat 09 Apr 2022 09:18:28 PM CST] Success
[Sat 09 Apr 2022 09:18:28 PM CST] Verifying: *.sofineday.com
[Sat 09 Apr 2022 09:18:31 PM CST] Pending, The CA is processing your order, please just wait. (1/30)
[Sat 09 Apr 2022 09:18:33 PM CST] Success
[Sat 09 Apr 2022 09:18:33 PM CST] Removing DNS records.
[Sat 09 Apr 2022 09:18:33 PM CST] Removing txt: J6Fijfd78wgVKOqQ9AZzhMzlq60WwCeuHCXxr0ao80I for domain: _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:18:36 PM CST] Removed: Success
[Sat 09 Apr 2022 09:18:36 PM CST] Removing txt: vl7Dmv3I3K83yeVwUQUg6l9SGpzhj0c06W87cyhwdhc for domain: _acme-challenge.sofineday.com
[Sat 09 Apr 2022 09:18:39 PM CST] Removed: Success
[Sat 09 Apr 2022 09:18:39 PM CST] Verify finished, start to sign.
[Sat 09 Apr 2022 09:18:39 PM CST] Lets finalize the order.
[Sat 09 Apr 2022 09:18:39 PM CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/489730070/78685657260'
[Sat 09 Apr 2022 09:18:40 PM CST] Downloading cert.
[Sat 09 Apr 2022 09:18:40 PM CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03c0eb027c64ee2385bc63164c6859c78936'
[Sat 09 Apr 2022 09:18:41 PM CST] Cert success.
-----BEGIN CERTIFICATE-----
MIIFMjCCBBqgAwIBAgISA8DrAnxk7iOFvGMWTGhZx4k2MA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjA0MDkxMjE4MzlaFw0yMjA3MDgxMjE4MzhaMBgxFjAUBgNVBAMT
DXNvZmluZWRheS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA
9Db5gZwDb5hDJrsVdjgWz8Vo3i8LdbJI+ekWZCaqd5bRkkiQlsG+eR7R8EFx523h
a9gZIsKwRxfPHbtmhwi2dbEC5lp9JnHUwiyuGlj+7hWWD6tk+qJZDsNhGSNJLDHU
aSQZPtHNLLgQe+4Ebza1YzZjrbckJYoLU9Z/QBW7bJ663HZPtqVgYmNPJp/6vRM/
obU5nMeIiBtbKlKbLj/GiY6qfJZaTsFsKweXgWpKP3T2R+DUZzr+X/e74gRrfJvv
M6GH4nlYfXQUDVMTPJr5mxucDIcfCF0GoI/HWDGygm+TP2IcCMB++brUiHWGFpBF
BJzTuSmjz6rMXT2bMEp7AgMBAAGjggJaMIICVjAOBgNVHQ8BAf8EBAMCBaAwHQYD
VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O
BBYEFAfHx5ZjyHE2HFxemnD48j+U64F8MB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ
QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz
Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv
MCkGA1UdEQQiMCCCDyouc29maW5lZGF5LmNvbYINc29maW5lZGF5LmNvbTBMBgNV
HSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpo
dHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQUGCisGAQQB1nkCBAIEgfYEgfMA
8QB3AEHIyrHfIkZKEMahOglCh15OMYsbA+vrS8do8JBilgb2AAABgA56B4EAAAQD
AEgwRgIhAOfjvcPoqyBNuO8kp0xhg4TWYRd1tD8lkJpTNqjsHvydAiEAwVTCAgDm
XpheyaepkfeDjg2/9lzd9mboO/yzziiqHNIAdgBGpVXrdfqRIDC1oolp9PN9ESxB
dL79SbiFq/L8cP5tRwAAAYAOege7AAAEAwBHMEUCIQC/xWJZ35gtp0WjjAib7psE
a0noXK4+zb9XyE/ksoligQIgLnncKjYGaX0vDSAgCktv86/xUMydFhU4QxKYwo6C
fnowDQYJKoZIhvcNAQELBQADggEBALWb+zJkZPE27Xcsfepij5QUfbmQRgjUeJE3
yawPYswWc+6CWQghlzr3dlXyT3ExAQxFi2t5N7cKneUaJtDO0tvDH/VaaEUgYpzE
RvwW/v8pjYQVqyMduT881vFcz0rjZC5sAMKHtE1esrJrD2ApJVDG3dTB3i0S3L6l
hEmmzBQdjK1NbIh3gpcpaHfwSjqr9zRIA/tKFqO0NUbx2tn4+XnO34AZMZOGjB+F
+WVf02er748xvDxqzVwIzIi9DQDz1t6ESMPQZC07o9VTl2vwxtWEq/ic5KmwpZhe
1btv6iZJHEtZQE5WzPYGcxYPTsfg3OEYJSomr2KT0RntTKC6nVo=
-----END CERTIFICATE-----
[Sat 09 Apr 2022 09:18:41 PM CST] Your cert is in: /root/.acme.sh/sofineday.com/sofineday.com.cer
[Sat 09 Apr 2022 09:18:41 PM CST] Your cert key is in: /root/.acme.sh/sofineday.com/sofineday.com.key
[Sat 09 Apr 2022 09:18:41 PM CST] The intermediate CA cert is in: /root/.acme.sh/sofineday.com/ca.cer
[Sat 09 Apr 2022 09:18:41 PM CST] And the full chain certs is there: /root/.acme.sh/sofineday.com/fullchain.cer
root@VM-0-6-ubuntu:~#
 
        Copied!
    

通过如上的真实示例可以看出,命令acme.sh --issue --dns dns_ali -d sofineday.com -d *.sofineday.com执行失败,改为acme.sh --issue --dns dns_ali -d sofineday.com -d *.sofineday.com --server letsencrypt后执行成功了。

3. 安装证书

3.1 安装证书

执行如下命令将前面生成的证书安装到 nginx 中。本质上就是拷贝证书文件到 nginx 的证书目录下。
该命令会被 ACME 记录下来,当做证书更新操作时,会自动执行该命令

acme.sh  --installcert -d sofineday.com \
         --key-file /data/docker-service/nginx/cert/_.sofineday.com.private.key \
         --fullchain-file /data/docker-service/nginx/cert/_.sofineday.com.full_chain.pem \
         --reloadcmd "docker cp /data/docker-service/nginx/cert/_.sofineday.com.private.key nginx:/etc/nginx/cert/ && docker cp /data/docker-service/nginx/cert/_.sofineday.com.full_chain.pem nginx:/etc/nginx/cert/ && docker exec -it nginx service nginx force-reload"

命令参数的含义:

  • -d
    表示证书所属的域名
  • --key-file
    复制前面生成的 .key 文件到哪个位置。
    一般为 nginx 配置文件中 ssl_certificate_key 指定的路径。
  • --fullchain-file
    复制前面生成的 fullchain.cer 文件到哪个位置
    一般为 nginx 配置文件中 ssl_certificate 指定的路径。
  • --reloadcmd
    执行完证书文件的复制操作后,还需要执行哪些命令才能将目标证书文件成功配置到 nginx 上。
    一般为 service nginx force-reload,强制重新加载配置文件即可启用最新的证书。
    该命令就很灵活了,甚至您可以在其它机器上完成证书的安装,然后再远程把证书文件同步到域名所在服务器上。

3.2 配置nginx

修改nginx配置文件,开启443端口, 配置证书路径。
配置方法详见nginx配置https。 修改完成后,执行service nginx force-reload重新加载配置。
那么,您的网站支持https访问了。

4. 自动续期

acme.sh 已经自动安装了定时任务, 如下:

[root@iZ2ze7011et12xez70sp3dZ ~]# crontab -l
10 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
[root@iZ2ze7011et12xez70sp3dZ ~]#

该定时任务会每日定时检查 1 次,如果证书更新时间已到,则会自动更新并安装证书。   可以通过acme.sh --list命令查看证书的下次更新时间(见 Renew 列)。

此处提到的证书更新时间证书到期时间并非同一个概念,证书更新时间指的是执行证书更新的时间,而证书到期时间表示到了该时间后证书无效而导致无法通过 https 访问服务。

[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --list
Main_Domain    KeyLength  SAN_Domains      CA               Created                               Renew
sofineday.com  ""         *.sofineday.com  LetsEncrypt.org  2020年 11月 03日 星期二 02:29:41 UTC  2021年 01月 02日 星期六 02:29:41 UTC
[root@iZ2ze7011et12xez70sp3dZ ~]#  

我们先手工执行下定时任务的命令"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh",看下输出什么内容:

[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --list
Main_Domain    KeyLength  SAN_Domains      CA               Created                               Renew
sofineday.com  ""         *.sofineday.com  LetsEncrypt.org  2020年 11月 03日 星期二 08:44:52 UTC  2021年 01月 02日 星期六 08:44:52 UTC
[root@iZ2ze7011et12xez70sp3dZ ~]# "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh"
[2020年 11月 03日 星期二 17:20:16 CST] ===Starting cron===
[2020年 11月 03日 星期二 17:20:16 CST] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 7
[2020年 11月 03日 星期二 17:20:16 CST] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 7
[2020年 11月 03日 星期二 17:20:16 CST] Installing from online archive.
[2020年 11月 03日 星期二 17:20:16 CST] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[2020年 11月 03日 星期二 17:20:22 CST] Extracting master.tar.gz
[2020年 11月 03日 星期二 17:20:23 CST] Installing to /root/.acme.sh
[2020年 11月 03日 星期二 17:20:23 CST] Installed to /root/.acme.sh/acme.sh
[2020年 11月 03日 星期二 17:20:23 CST] Good, bash is found, so change the shebang to use bash as preferred.
[2020年 11月 03日 星期二 17:20:23 CST] OK
[2020年 11月 03日 星期二 17:20:23 CST] Install success!
[2020年 11月 03日 星期二 17:20:24 CST] Upgrade success!
[2020年 11月 03日 星期二 17:20:24 CST] Auto upgraded to: 2.8.8
[2020年 11月 03日 星期二 17:20:24 CST] Renew: 'mydomain.com'
[2020年 11月 03日 星期二 17:20:24 CST] 'mydomain.com' is not an issued domain, skip.
[2020年 11月 03日 星期二 17:20:24 CST] Skipped mydomain.com
[2020年 11月 03日 星期二 17:20:24 CST] Renew: 'sofineday.com'
[2020年 11月 03日 星期二 17:20:24 CST] Skip, Next renewal time is: 2021年 01月 02日 星期六 08:44:52 UTC
[2020年 11月 03日 星期二 17:20:24 CST] Add '--force' to force to renew.
[2020年 11月 03日 星期二 17:20:24 CST] Skipped sofineday.com
[2020年 11月 03日 星期二 17:20:24 CST] ===End cron===
[root@iZ2ze7011et12xez70sp3dZ ~]#

可以看出,默认情况下,需要到了预定的时间 2021 年 01 月 02 日 星期六 08:44:52 UTC(见 Renew 列,默认为证书生成后的 60 天,也可以自定义,前文有描述), 才会自动更新证书。若想强制更新证书,则需要增加--force 参数,见下一节的内容手动更新证书

5. 手动更新证书

手动更新证书有多种方式:

  • 通过 acme.sh 的 renew 指令
  • 通过定时任务执行

5.1 通过 acme.sh 的 renew 指令

通过 renew 指令会比第 2 种方式更灵活。可以单独更新某个证书,也可以更新所有证书。

  • 单独更新某个证书
    acme.sh --renew --domain sofineday.com
[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --renew --domain sofineday.com
[2020年 11月 03日 星期二 18:01:38 CST] Renew: 'sofineday.com'
[2020年 11月 03日 星期二 18:01:38 CST] Skip, Next renewal time is: 2021年 01月 02日 星期六 08:44:52 UTC
[2020年 11月 03日 星期二 18:01:38 CST] Add '--force' to force to renew.
[root@iZ2ze7011et12xez70sp3dZ ~]#

因为更新时间没有到,所以没有执行更新操作。若想强制更新,则追加--force 参数:
acme.sh --renew --domain sofineday.com --force
执行过程如下:

[2020 年 11 月 03 日 星期二 18:03:22 CST] Renew: 'sofineday.com'
[2020 年 11 月 03 日 星期二 18:03:23 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2020 年 11 月 03 日 星期二 18:03:23 CST] Multi domain='DNS:sofineday.com,DNS:_.sofineday.com'
[2020 年 11 月 03 日 星期二 18:03:23 CST] Getting domain auth token for each domain
[2020 年 11 月 03 日 星期二 18:03:30 CST] Getting webroot for domain='sofineday.com'
[2020 年 11 月 03 日 星期二 18:03:30 CST] Getting webroot for domain='_.sofineday.com'
[2020 年 11 月 03 日 星期二 18:03:31 CST] sofineday.com is already verified, skip dns-01.
[2020 年 11 月 03 日 星期二 18:03:31 CST] _.sofineday.com is already verified, skip dns-01.
[2020 年 11 月 03 日 星期二 18:03:31 CST] Verify finished, start to sign.
[2020 年 11 月 03 日 星期二 18:03:31 CST] Lets finalize the order.
[2020 年 11 月 03 日 星期二 18:03:31 CST] Le*OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/101071293/6015050649'
[2020 年 11 月 03 日 星期二 18:03:33 CST] Downloading cert.
[2020 年 11 月 03 日 星期二 18:03:33 CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/046a3b81d368232ac6da38c1db0bd803fafc'
[2020 年 11 月 03 日 星期二 18:03:34 CST] Cert success.
-----BEGIN CERTIFICATE-----
MIIFZDCCBEygAwIBAgISBGo7gdNoIyrG2jjB2wvYA/r8MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDExMDMwOTAzMzNaFw0y
MTAyMDEwOTAzMzNaMBgxFjAUBgNVBAMTDXNvZmluZWRheS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfAdIati/JZFCEMmTXD4j2UgOwKbKynjHk
ghcW0wA+YyNvIW/Y/kmN4fMk3qEslG6l/XXZ0Lv1IYYStRY70BlUUsHsJ/K/Mu0O
+EFcCBOfggOoZ8J6RCP1tU/erTq2JJTiWNmlQSqCq92SyJJvVdYYOBRrlMuxtBba
8pPLjcpxeSO4iEqlNJh+VJNJE1Loh3X77zRBkLwlsetcI/DwKEn670M01l61XMG1
QMX8RRkp+O4J8Hy6SJlEFv1a320pZJ9IA5D3x8YpgvKJzb5043aN0gPBJ37MVtJq
Mw4NBh9gLk8JKNgbNgJPkJypggLXmGYiLLaFIZEPcoDtjF+xdQ+1AgMBAAGjggJ0
MIICcDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFORKHDj/oRKs5nweoobwEffhV0T0
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wKQYDVR0RBCIwIIIPKi5zb2ZpbmVkYXkuY29tgg1zb2ZpbmVkYXkuY29tMEwG
A1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEW
Gmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHWeQIEAgSB9gSB
8wDxAHYA9lyUL9F3MCIUVBgIMJRWjuNNExkzv98MLyALzE7xZOMAAAF1jY/NuAAA
BAMARzBFAiEAmaVBTxlQ47FYowMBQZyHKilgT46kA/Ud/YdHLV9zO3ECIBO2v0+T
A4JWbub/BvJZXSOD84xXtiiZAMGz2LfP3bVhAHcAb1N2rDHwMRnYmQCkURX/dxUc
EdkCwQApBo2yCJo32RMAAAF1jY/OEQAABAMASDBGAiEA3quHKHc/28EMK3KMTqZU
xKPEgO4N0g3P+rR6qW8B7YMCIQCDq/146h+GYWrO52U6Ey3M4AfOLxf3IHDya9fl
jYV/ETANBgkqhkiG9w0BAQsFAAOCAQEAmNORzZu1BwiXup3TIzASl/odXVhsJF/I
MXqMDSXR8cuafkralwCYy/ewh4vcgcZSfd0XCS/xPHDKZ5MeaKSh8enchH2WD6+G
Xyf8c4pWWdGKWqKxyPcX+5+hWvbzg/3SL7uDbBbhV9sRspGhQV4okEbYJvFLAydg
uoYaDiMoHUrjgz9atLcHn6EgHelcv5JcJkVZR+qD2MmZwh5LFZFNkDhGJUOFAUbm
1UDbGTUZt4CFx7ihZ7V9JJ69QQh+2Hub3SQJU3vHpB0pEKH7bBsfIomaWowQa3FQ
j+3GSgudM1QR9EKUhENHTqJ+RXdGu2AFH22W1L25L1Eh0U27g89lZw==
-----END CERTIFICATE-----
[2020 年 11 月 03 日 星期二 18:03:34 CST] Your cert is in /root/.acme.sh/sofineday.com/sofineday.com.cer
[2020 年 11 月 03 日 星期二 18:03:34 CST] Your cert key is in /root/.acme.sh/sofineday.com/sofineday.com.key
[2020 年 11 月 03 日 星期二 18:03:34 CST] The intermediate CA cert is in /root/.acme.sh/sofineday.com/ca.cer
[2020 年 11 月 03 日 星期二 18:03:34 CST] And the full chain certs is there: /root/.acme.sh/sofineday.com/fullchain.cer
[2020 年 11 月 03 日 星期二 18:03:34 CST] Installing key to:/data/docker-service/nginx/cert/*.sofineday.com.private.key
[2020 年 11 月 03 日 星期二 18:03:34 CST] Installing full chain to:/data/docker-service/nginx/cert/*.sofineday.com.full_chain.pem
[2020 年 11 月 03 日 星期二 18:03:34 CST] Run reload cmd: docker cp /data/docker-service/nginx/cert/*.sofineday.com.private.key nginx:/etc/nginx/cert/ && docker cp /data/docker-service/nginx/cert/\_.sofineday.com.full_chain.pem nginx:/etc/nginx/cert/ && docker exec -it nginx service nginx force-reload
[ ok ] Reloading nginx: nginx.
[2020 年 11 月 03 日 星期二 18:03:35 CST] Reload success
[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --list
Main_Domain KeyLength SAN_Domains CA Created Renew
sofineday.com "" _.sofineday.com LetsEncrypt.org 2020 年 11 月 03 日 星期二 10:03:34 UTC 2021 年 01 月 02 日 星期六 10:03:34 UTC
[root@iZ2ze7011et12xez70sp3dZ ~]#  
  • 更新所有证书 用法同单独更新某个证书类似,只需将参数名改为--renew-all: acme.sh --renew-all 强制更新: acme.sh --renew-all --force

5.2 通过定时任务执行

acme 内部维护着一个定时任务,到达指定时间(见 acme.sh --list 输出的 Renew 列),则会更新证书。   若您想在证书过期之前,提前更新证书,则执行如下命令即可: acme.sh --cron --force

[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --list
Main*Domain KeyLength SAN_Domains CA Created Renew
sofineday.com "" *.sofineday.com LetsEncrypt.org 2020 年 11 月 03 日 星期二 02:29:41 UTC 2021 年 01 月 02 日 星期六 02:29:41 UTC
[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --cron --force
[2020 年 11 月 03 日 星期二 16:44:33 CST] ===Starting cron===
[2020 年 11 月 03 日 星期二 16:44:33 CST] Installing from online archive.
[2020 年 11 月 03 日 星期二 16:44:33 CST] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[2020 年 11 月 03 日 星期二 16:44:41 CST] Extracting master.tar.gz
[2020 年 11 月 03 日 星期二 16:44:41 CST] Installing to /root/.acme.sh
[2020 年 11 月 03 日 星期二 16:44:41 CST] Installed to /root/.acme.sh/acme.sh
[2020 年 11 月 03 日 星期二 16:44:41 CST] Good, bash is found, so change the shebang to use bash as preferred.
[2020 年 11 月 03 日 星期二 16:44:42 CST] OK
[2020 年 11 月 03 日 星期二 16:44:42 CST] Install success!
[2020 年 11 月 03 日 星期二 16:44:43 CST] Upgrade success!
[2020 年 11 月 03 日 星期二 16:44:43 CST] Auto upgraded to: 2.8.8
[2020 年 11 月 03 日 星期二 16:44:43 CST] Renew: 'mydomain.com'
[2020 年 11 月 03 日 星期二 16:44:43 CST] 'mydomain.com' is not an issued domain, skip.
[2020 年 11 月 03 日 星期二 16:44:43 CST] Skipped mydomain.com
[2020 年 11 月 03 日 星期二 16:44:43 CST] Renew: 'sofineday.com'
[2020 年 11 月 03 日 星期二 16:44:45 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2020 年 11 月 03 日 星期二 16:44:45 CST] Multi domain='DNS:sofineday.com,DNS:_.sofineday.com'
[2020 年 11 月 03 日 星期二 16:44:45 CST] Getting domain auth token for each domain
[2020 年 11 月 03 日 星期二 16:44:49 CST] Getting webroot for domain='sofineday.com'
[2020 年 11 月 03 日 星期二 16:44:49 CST] Getting webroot for domain='_.sofineday.com'
[2020 年 11 月 03 日 星期二 16:44:49 CST] sofineday.com is already verified, skip dns-01.
[2020 年 11 月 03 日 星期二 16:44:49 CST] _.sofineday.com is already verified, skip dns-01.
[2020 年 11 月 03 日 星期二 16:44:49 CST] Verify finished, start to sign.
[2020 年 11 月 03 日 星期二 16:44:49 CST] Lets finalize the order.
[2020 年 11 月 03 日 星期二 16:44:49 CST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/101071293/6014120473'
[2020 年 11 月 03 日 星期二 16:44:51 CST] Downloading cert.
[2020 年 11 月 03 日 星期二 16:44:51 CST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/0397895ff02c722b847007f4dbd979eda735'
[2020 年 11 月 03 日 星期二 16:44:52 CST] Cert success.
-----BEGIN CERTIFICATE-----
MIIFYzCCBEugAwIBAgISA5eJX/AsciuEcAf029l57ac1MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDExMDMwNzQ0NTBaFw0y
MTAyMDEwNzQ0NTBaMBgxFjAUBgNVBAMTDXNvZmluZWRheS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfAdIati/JZFCEMmTXD4j2UgOwKbKynjHk
ghcW0wA+YyNvIW/Y/kmN4fMk3qEslG6l/XXZ0Lv1IYYStRY70BlUUsHsJ/K/Mu0O
+EFcCBOfggOoZ8J6RCP1tU/erTq2JJTiWNmlQSqCq92SyJJvVdYYOBRrlMuxtBba
8pPLjcpxeSO4iEqlNJh+VJNJE1Loh3X77zRBkLwlsetcI/DwKEn670M01l61XMG1
QMX8RRkp+O4J8Hy6SJlEFv1a320pZJ9IA5D3x8YpgvKJzb5043aN0gPBJ37MVtJq
Mw4NBh9gLk8JKNgbNgJPkJypggLXmGYiLLaFIZEPcoDtjF+xdQ+1AgMBAAGjggJz
MIICbzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFORKHDj/oRKs5nweoobwEffhV0T0
MB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMw
YTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9y
ZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9y
Zy8wKQYDVR0RBCIwIIIPKi5zb2ZpbmVkYXkuY29tgg1zb2ZpbmVkYXkuY29tMEwG
A1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEW
Gmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBAYKKwYBBAHWeQIEAgSB9QSB
8gDwAHUAlCC8Ho7VjWyIcx+CiyIsDdHaTV5sT5Q9YdtOL1hNosIAAAF1jUe+ngAA
BAMARjBEAiBmEQew/ZTGak523Jesy31aSBCy03TbSmOaEIS7C9ez9AIgRfaJXCtF
G6WXDnpqsDu04MkWvBa7ykB+7TmYe2n9f34AdwB9PvL4j/+IVWgkwsDKnlKJeSvF
DngJfy5ql2iZfiLw1wAAAXWNR77gAAAEAwBIMEYCIQCMo0BVA8eflzxz6xJsuUTe
TG2LPIXqPB+TVPEDAZLBRQIhALcjTfd4i4evNxbWSzXg2X/0pYpho+RGmtW8tUR7
edqUMA0GCSqGSIb3DQEBCwUAA4IBAQBKJRQMmLfgs+tyk4vP4k854OWYZzi4dzD9
UO7bLIroQyS2V26mX7MNr35G5+KRpHtXOy5VYOePh1AgQSkJfi0v6efNlPVQ+Kub
iANsqQHcoDmnfPz9/iPIQ2O9ei1oD/Rkx0zBKXrzOlpf7vezreTFbXOuhbD5EwSc
q+70BQ4LRU7+29MLStjlBp0NGZeiMh3MjtcNtnryK2d4zwzWQKuAY+gKHPYof5M1
11d+5vYEFC/wfuZUMMcNhGeJcxr/nAn+0j+7ok9iirijkuhe5/vI2XOF/e9BYCch
TK4w/d0Q7x7yW87NjqEly27nhpUqIhGYNUNWZ325MIvCr3GoDm/h
-----END CERTIFICATE-----
[2020 年 11 月 03 日 星期二 16:44:52 CST] Your cert is in /root/.acme.sh/sofineday.com/sofineday.com.cer
[2020 年 11 月 03 日 星期二 16:44:52 CST] Your cert key is in /root/.acme.sh/sofineday.com/sofineday.com.key
[2020 年 11 月 03 日 星期二 16:44:52 CST] The intermediate CA cert is in /root/.acme.sh/sofineday.com/ca.cer
[2020 年 11 月 03 日 星期二 16:44:52 CST] And the full chain certs is there: /root/.acme.sh/sofineday.com/fullchain.cer
[2020 年 11 月 03 日 星期二 16:44:52 CST] Installing key to:/data/docker-service/nginx/cert/_.sofineday.com.private.key
[2020 年 11 月 03 日 星期二 16:44:52 CST] Installing full chain to:/data/docker-service/nginx/cert/_.sofineday.com.full_chain.pem
[2020 年 11 月 03 日 星期二 16:44:52 CST] Run reload cmd: docker cp /data/docker-service/nginx/cert/_.sofineday.com.private.key nginx:/etc/nginx/cert/ && docker cp /data/docker-service/nginx/cert/\_.sofineday.com.full_chain.pem nginx:/etc/nginx/cert/ && docker exec -it nginx service nginx force-reload
[ ok ] Reloading nginx: nginx.
[2020 年 11 月 03 日 星期二 16:44:53 CST] Reload success
[2020 年 11 月 03 日 星期二 16:44:53 CST] ===End cron===
[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --list
Main_Domain KeyLength SAN_Domains CA Created Renew
sofineday.com "" \*.sofineday.com LetsEncrypt.org 2020 年 11 月 03 日 星期二 08:44:52 UTC 2021 年 01 月 02 日 星期六 08:44:52 UTC
[root@iZ2ze7011et12xez70sp3dZ ~]#

 
        Copied!
    

6. 查看证书列表

执行如下命令,查看证书列表 ~/.acme.sh/acme.sh --list

[root@iZ2ze7011et12xez70sp3dZ ~]# acme.sh --list
Main_Domain KeyLength SAN_Domains CA Created Renew
sofineday.com "" \*.sofineday.com LetsEncrypt.org 2020 年 11 月 03 日 星期二 02:29:41 UTC 2021 年 01 月 02 日 星期六 02:29:41 UTC
[root@iZ2ze7011et12xez70sp3dZ ~]#

Created 表示申请时间, Renew表示下次执行证书更新的时间。

7. 删除证书

acme.sh --remove --domain sofineday.com

将域名换成实际域名即可

8. 更新 acme.sh

由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。 升级 acme.sh 到最新版:

acme.sh --upgrade   

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

acme.sh --upgrade --auto-upgrade

您也可以随时关闭自动更新:

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

9. 检测网站的安全级别

可以使用如下网站检测网站的安全级别:

10. 其它资料

freessl.cn官方提供的证书自动续期方案

https://ohttps.com/

发现freessl.cn总结了一套”支持https证书自动续期“的文档,但经过我的实际操作发现,生成证书时一直失败并最终退出(尝试过多次)。所以并没有见得比我之前总结的方法好。但是可以作为拓展资料,见ACME v2证书自动化快速入门 (opens new window)
该套方案实际上是使用freessl.cn创建的CA服务器来生成证书。

操作步骤:

  1. 访问https://freessl.cn
  2. 输入域名
  3. 选择带有多域名通配符(有效期:自动续期)标志的亚洲诚信厂商
  4. 点击创建免费的ssl证书
  5. 按提示操作即可
posted @ 2024-01-17 16:20  Gshelldon  阅读(1007)  评论(0编辑  收藏  举报