# ACME

这里配合B站视频 (opens new window),食用更香。

# 一、安装acme.sh

# 1. 安装依赖

安装 SSL 证书生成脚本依赖

apt install socat netcat -y
1

socat 是一个多功能的网络工具,名字来由是“Socket CAT”,可以看作是 netcat 的加强版。它有一些netcat所不具备却又很有需求的功能,例如ssl连接。socat是强大的,可以实现任意socket的转换。而netcat被称为网络工具中的瑞士军刀,体积小巧,但功能强大。netcat可以在两台设备上面相互交互,即侦听模式/传输模式。

# 2. 运行安装脚本

wget -O -  https://get.acme.sh | sh
1

# 3. 让 acme.sh 命令生效

. .bashrc
1

# 4. 开启 acme.sh 的自动升级

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。

升级 acme.sh 到最新版 :

acme.sh --upgrade
1

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

acme.sh --upgrade --auto-upgrade
1

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

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

# 二、证书签发

# 1. 选择默认 CA(可选)

目前 acme.sh 支持四个正式环境 CA,分别是 Let's Encrypt、Buypass、ZeroSSL 和 SSL.com,默认使用 ZeroSSL

功能 LE Buypass ZeroSSL SSL.com Google Public CA
有效期 90 天 180 天 90 天 90 天 90 天
多域名 支持 支持,最多 5 个 支持 收费支持 支持
泛域名 支持 不支持 支持 收费支持 支持
Rate Limit 收费无 未知
GUI 管理
ECC 证书链 未知
客户支持 社区 收费 收费 收费 收费

简单来说,如果没有特殊需求,可以选择 Let's Encrypt,如果服务器在国内,可以选择 ZeroSSL 或 Buypass,如果愿意付费得到更好的服务和保障,可以选择 ZeroSSL 和 SSL.com,如果面向欧盟用户,可以选择 Buypass 和 ZeroSSL。

注意:经过测试 Google Public CA 的 ACME 验证域名在国内是无法访问的,只有国外服务器才可以申请,申请完成后的证书并无影响。

如果需要更换可以使用如下命令:

切换 Let's Encrypt

~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
1

切换 Buypass

acme.sh --set-default-ca --server buypass
1

切换 ZeroSSL

acme.sh --set-default-ca --server zerossl
# 注册
~/.acme.sh/acme.sh --register-account -m my@example.com
# 如果已有 ZeroSSL 帐号,可以在后台控制面板拿到 API Key,然后执行如下命令
apt install jq
curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key" | jq
# 终端会输出如下内容
{
  "success": true,
  "eab_kid": "kid字符串",
  "eab_hmac_key": "hmac_key字符串",
}
# 然后手工添加帐号
acme.sh --register-account  --server zerossl \
        --eab-kid kid字符串  \
        --eab-hmac-key hmac_key字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

切换 SSL.com

acme.sh --set-default-ca --server ssl.com
1

切换 Google Public CA

acme.sh --set-default-ca --server google
1

# 2. 测试证书申请

在正式申请证书之前,我们先用测试命令(--issue --test)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多 5 次),导致后面的步骤无法进行

测试证书申请的命令如下(本文均以 ECC 证书为例,因为时至今日,实在没什么理由不用它)

acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
1

说明

ECC证书的主要优势在于它的 Keysize 更小,意味着同等大小下安全性的提升和加密解密速度的加快。如 ECC-256bit 的强度大约相当于 RSA-3072bit,何乐而不为呢?当然,有人说 ECC 证书握手会明显更快,这我觉得就有些夸张了,因为 RSA 握手也没有太慢,就算有差别应该也是毫秒级,很难直接感知。

另外,如果有些网站确实需要兼容某些古老设备的,那也还是请按需选择RSA证书。

你最终应该看到类似这样的提示:

dmit-pocket-➜  ~ acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/www/webpage --keylength ec-256
[Sat Dec  2 02:27:00 UTC 2023] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Sat Dec  2 02:27:00 UTC 2023] Create account key ok.
[Sat Dec  2 02:27:00 UTC 2023] Registering account: https://acme-v02.api.letsencrypt.org/directory
[Sat Dec  2 02:27:00 UTC 2023] Registered
[Sat Dec  2 02:27:00 UTC 2023] ACCOUNT_THUMBPRINT='UcQWXCzFgiImwXGt5BYteCCBLw41_Gh5sMpADXPI2ek'
[Sat Dec  2 02:27:00 UTC 2023] Creating domain key
[Sat Dec  2 02:27:00 UTC 2023] The domain key is here: /root/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
[Sat Dec  2 02:27:00 UTC 2023] Single domain='二级域名.你的域名.com'
[Sat Dec  2 02:27:00 UTC 2023] Getting domain auth token for each domain
[Sat Dec  2 02:27:01 UTC 2023] Getting webroot for domain='二级域名.你的域名.com'
[Sat Dec  2 02:27:01 UTC 2023] Verifying: 二级域名.你的域名.com
[Sat Dec  2 02:27:01 UTC 2023] Pending, The CA is processing your order, please just wait. (1/30)
[Sat Dec  2 02:27:04 UTC 2023] Success
[Sat Dec  2 02:27:04 UTC 2023] Verify finished, start to sign.
[Sat Dec  2 02:27:04 UTC 2023] Lets finalize the order.
[Sat Dec  2 02:27:04 UTC 2023] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/1443960576/226252090076'
[Sat Dec  2 02:27:05 UTC 2023] Downloading cert.
[Sat Dec  2 02:27:05 UTC 2023] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/04f9e9acb407ffbe7f141f5cd3d0865082c1'
[Sat Dec  2 02:27:05 UTC 2023] Cert success.
-----BEGIN CERTIFICATE-----
MIIELzCCAxegAwIBAgISBPnprLQH/75/FB9c09CGUILBMA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMzEyMDIwMTI3MDRaFw0yNDAzMDEwMTI3MDNaMCExHzAdBgNVBAMT
FnBvY2tldC5kdWFuZ2R1YW5nLnRlY2gwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AAQ7IEFL3MOYv0NtoHH5E4vvWb3WO8o7rxOxWDg5SMvDMGI9e2MZxvk0OM3kNs05
F707MsL6LbWW4vKkhYZRiVXIo4ICGTCCAhUwDgYDVR0PAQH/BAQDAgeAMB0GA1Ud
JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBSjbST3v1yqoSyCM+O7+FoemUE9KTAfBgNVHSMEGDAWgBQULrMXt1hWy65QCUDm
H6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9yMy5v
LmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iub3JnLzAh
BgNVHREEGjAYghZwb2NrZXQuZHVhbmdkdWFuZy50ZWNoMBMGA1UdIAQMMAowCAYG
Z4EMAQIBMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHYASLDja9qmRzQP5WoC+p0w
6xxSActW3SyB2bu/qznYhHMAAAGMKFnUXwAABAMARzBFAiEAu9Tkpr2z5joVzefe
r3BmFVKvM/A3DtomP14aIBMnUYECIFv7LoR5ohFLXEwye/hn0x2KFB6NvPO+z8eI
cx2YJTOdAHcA7s3QZNXbGs7FXLedtM0TojKHRny87N7DUUhZRnEftZsAAAGMKFnU
lgAABAMASDBGAiEA7lNGiWpZIM7dCN9D0dxtYmDeRj1iCNiCpJl3+nte95QCIQCj
2mPmFI3cZNUro8qi/wgxssy5LfDBs//XPD/lr/5rUjANBgkqhkiG9w0BAQsFAAOC
AQEALrvpmabqBlZ//Xz63tY7ouOoMy/k00BJ9PD+TehC0GSE6N5I2UqJXFmMiRBW
zMVTa1eojCUdLH8oNtZh+1chTWO5jo13Z/UdIctVIuXDW2abKszdWOrK/H/GsPDQ
CJTDY7nJZp9ZYIijO99itmWt9nclrBLXpdaciUPGLWBA+uA6Fo4WTghA4GPqLZvS
iAP6Q9+nWK6mrl/Yxrsl47VKyjOX7PVgVP4bqYNRnZ/TkEH1vof3uIfwSsz943Sa
HKTF4UZ4Yh0t0LUoIf07CAABJuOk6Kl3O7N/SpYGUMhdRoG2LiaDj4fckycHEk4T
xUCLWMLR/VOSMwBpL5fu6mergg==
-----END CERTIFICATE-----
[Sat Dec  2 02:27:05 UTC 2023] Your cert is in: /root/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
[Sat Dec  2 02:27:05 UTC 2023] Your cert key is in: /root/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
[Sat Dec  2 02:27:05 UTC 2023] The intermediate CA cert is in: /root/.acme.sh/二级域名.你的域名.com_ecc/ca.cer
[Sat Dec  2 02:27:05 UTC 2023] And the full chain certs is there: /root/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。

acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
1

# 3. 正式证书申请

# 单域名证书申请

假设服务器在运行着的,网站域名为 example.com,根目录为 /home/wwwroot/example.com。那么只需要执行下面这条语句就行。

acme.sh --set-default-ca --server letsencrypt
acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
1
2

说明

--force 参数的意思就是,在现有证书到期前,手动(强行)更新证书。上一步我们从“测试服”申请的证书虽然不能直接用,但是它本身是尚未过期的,所以需要用到这个参数。

你最终应该看到跟上面很像的提示:

vpsadmin@vps-server:~$ acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
[Wed 30 Dec 2022 15:22:51 AM EST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Wed 30 Dec 2022 15:22:51 AM EST] Creating domain key
[Wed 30 Dec 2022 15:22:51 AM EST] The domain key is here: /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
[Wed 30 Dec 2022 15:22:51 AM EST] Single domain='二级域名.你的域名.com'
[Wed 30 Dec 2022 15:22:51 AM EST] Getting domain auth token for each domain
[Wed 30 Dec 2022 15:22:51 AM EST] Getting webroot for domain='二级域名.你的域名.com'
[Wed 30 Dec 2022 15:22:51 AM EST] Verifying: 二级域名.你的域名.com
[Wed 30 Dec 2022 15:22:51 AM EST] Pending
[Wed 30 Dec 2022 15:22:51 AM EST] Success
[Wed 30 Dec 2022 15:22:51 AM EST] Verify finished, start to sign.
[Wed 30 Dec 2022 15:22:51 AM EST] Lets finalize the order.
[Wed 30 Dec 2022 15:22:51 AM EST] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/490205996/7730242872'
[Wed 30 Dec 2022 15:22:51 AM EST] Downloading cert.
[Wed 30 Dec 2022 15:22:51 AM EST] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/vsxvk0oldnuobe51ayxz4dms62sk2dwmw9zhuw'
[Wed 30 Dec 2022 15:22:51 AM EST] Cert success.
--BEGIN CERTIFICAT--
sxlYqPvWreKgD5b8JyOQX0Yg2MLoRUoDyqVkd31PthIiwzdckoh5eD3JU7ysYBtN
cTFK4LGOfjqi8Ks87EVJdK9IaSAu7ZC6h5to0eqpJ5PLhaM3e6yJBbHmYA8w1Smp
wAb3tdoHZ9ttUIm9CrSzvDBt6BBT6GqYdDamMyCYBLooMyDEM4CUFsOzCRrEqqvC
2mTTEmhvpojo5rhdTSJxibozyNWTGwoTj0v9pTUeQcGqLIzqi4DowjBHD5guwRid
SjAFnm6JT2xUQgWFm58A1gv1OhbH1TRPUUmtE1nFEN7YiSjI4xgxqAXT3CLD2EUb
wXlUrO6c75zSsQP4bRMzgOjJUqHtSb6IEqELzt4M7KzL5iCOruCChCo2DZxUwvVX
tOoaAyQJzCbTqE6aUqwiKi3gVyoxvDP9mI5JdRYzsDL6GVud7EHPnYeMl9ubLZAK
0vg84mbMP3f6mYM4KRa1cqiyOIcQPT4AzGFYVv4sm049bZQg7sd0Bz9CaFvE7yDA
1y17XlgCDnsjxl66bqI1vkENN9XT5xeFHONqc18b5fZEKSIvdX7iWPFWp1PyMPpG
0pMCP1EymZNFxIMJLgbWqExwLWfPc5Ib3PjBaIqhXPnw6sT2MQSxXwDupq1UJVhV
7E3hQRVlwI4CXi6WLHJMNvNRyyK87gCrLH1bKYsPeRVaz77poWBq49zwBCts6hPY
IeF4ltGXyANNIOPEi8vy138fRU4LYh81d8FjOtFfJZogMjwhfNvapqxPMsioPlmX
TnZu0n7setrVNUEfTMHWqPpDgk5MPrWLA4LapqaDfEX4pwnQJLMwMi6s94z165c0
iMRSKA1yU5zqv8aNsDfPoY4OkSPWs4MaXgRRSLBsUfZ15DwQXPk76kegHIyxWvwF
tYw9HKR5QCMK66fa0z4aJoFVFLK0IIOGEZOanRFUCnkLUDd3QZ3YU8lEcrj7Uxos
haiRNICyC6UfsCJ94a8vcNyMosPv3xBLMp19WXgiFYqEFQkntkv1FLRI35fjeJmg
0fmD9VG9bkzGPHihJgQLRlCHasGf6XrdfkSsODAyCUHUHJ0RzqF4YEZMcxDxzuQ2
YO7bFwj7S3mUdVPZ6MPasjxdyBjJgEBMch2uy4AhmudXfEBQBye8W6ZI4ztZjLVV
FmP4SIuaNUmMe20TjR8b9NVC96AhxOanWT3mRROsdokpKQGTJvl27EHH8KuAbUOc
G6KtPy4wslNZNXWcBy9n63RcWak12r7kAIFn38tZxmlw2WUKoRSMAH64GcDTjRQd
Am65hBHzvGrj93wEuVNIebvNIsJOlng3HFjpIxVqKGMCIfWIKGDE3YzK3p4LbGZ6
NZFQWYJLNVf2M9CCJfbEImPYgvctrxl39H6KVYPCw1SAdaj9NneUqmREOQkKoEB0
x6PmNirbMscHhQPSC0JQaqUgaQFgba1ALmzRYAnYhNb0twkTxWbY7DBkAarxqMIp
yiLKcBFc5H7dgJCImo7us7aJeftC44uWkPM=
--END CERTIFICAT--
[Wed 30 Dec 2022 15:22:52 AM EST] Your cert is in  /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.cer
[Wed 30 Dec 2022 15:22:52 AM EST] Your cert key is in  /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/二级域名.你的域名.com.key
[Wed 30 Dec 2022 15:22:52 AM EST] The intermediate CA cert is in  /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/ca.cer
[Wed 30 Dec 2022 15:22:52 AM EST] And the full chain certs is there:  /home/vpsadmin/.acme.sh/二级域名.你的域名.com_ecc/fullchain.cer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

仔细观察,你会发现这次给你发证书的域名是 https://acme-v02.api.letsencrypt.org,少了 staging,自然就是【正式服】了!

# 多域名证书申请

~/.acme.sh/acme.sh --issue -d bihell.com -d www.bihell.com --standalone -k ec-384 --force
1

# DNS API 申请

官方DNS API列表 (opens new window)

# 阿里云通配域名申请

阿里云域名 (opens new window)为例,我们通过DNS进行验证。首先拿到阿里云的AccessKey (opens new window)

然后终端创建对应key的变量

# 将xxxxx替换成你自己的key
export Ali_Key="xxxxxxx"
export Ali_Secret="xxxxxxx"
1
2
3

执行以下语句申请证书

# 注意将域名改为你自己的
~/.acme.sh/acme.sh --issue --dns dns_ali -d bihell.com -d '*.bihell.com' -k ec-256 --force
1
2

# 3. 安装证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。

请注意,默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件,例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件。这里面的文件都是acmesh工具内部使用, 目录结构在将来可能会变化,进而导致服务器配置文件中填写的证书路径错误的情况。

正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

# 单域名或多域名配置

mkdir /data
~/.acme.sh/acme.sh --installcert -d bihell.com -d www.bihell.com --fullchainpath /data/dice.crt --keypath /data/dice.key --ecc
1
2

# 通配域名配置

mkdir /data
~/.acme.sh/acme.sh --installcert -d bihell.com -d '*.bihell.com' --fullchainpath /data/dice.crt --keypath /data/dice.key --ecc
1
2

# 6. 更新证书

证书的有效期为 90 天,acme.sh 会 60 天更新(Renew)一次。

在安装 acme.sh 的时候就自动配置了一条 cron 任务了,会每天检查证书的情况。当然可以到 crontab 里看一下。

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

也可以试着用上面这条命令执行看一下相关的配置是否正确。

强制更新可以这样

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

acme.sh --renew -d example.com --force --ecc  # 如果用的是ECC证书
1
2
3

# 7. 停止更新证书

# 查看证书列表
acme.sh --list

# 停止 Renew
acme.sh --remove -d example.com [--ecc]
1
2
3
4
5

# 8. Nginx 配置

server {

server_name example.com;

listen       443 ssl http2 default_server;

listen       [::]:443 ssl http2 default_server;

# ...

# ssl 相关配置

ssl_certificate /etc/nginx/ssl/example.com.fullchain.cer;

ssl_certificate_key /etc/nginx/ssl/example.com.key;

ssl_dhparam /etc/nginx/ssl/dhparam.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers '[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES';

ssl_prefer_server_ciphers on;

# ...

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

TLSv1.3(可选)

现在很多网站都上 TLSv1.3 了,证书检测的网站对于 TLSv1、TLSv1.1 都认为不安全了,Firefox 自 74.0 版本开始也完全放弃对加密协议 TLS 1.0 和 TLS 1.1 的支持了。

开启 HSTS(可选)

当然,为了更加安全,可以选择开启 HSTS(HTTP Strict Transport Security,HTTP严格传输安全协议),强制浏览器通过 https 进行访问。需要在 location 下的设置中加入一个 header。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
1
更新时间: 3/13/2024, 9:15:16 AM