ACME
ACME
这里配合B站视频,食用更香。
一、安装acme.sh
1. 安装依赖
安装 SSL 证书生成脚本依赖
apt install socat netcat -y
socat 是一个多功能的网络工具,名字来由是“Socket CAT”,可以看作是 netcat 的加强版。它有一些netcat所不具备却又很有需求的功能,例如ssl连接。socat是强大的,可以实现任意socket的转换。而netcat被称为网络工具中的瑞士军刀,体积小巧,但功能强大。netcat可以在两台设备上面相互交互,即侦听模式/传输模式。
2. 运行安装脚本
wget -O - https://get.acme.sh | sh
3. 让 acme.sh
命令生效
. .bashrc
4. 开启 acme.sh
的自动升级
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。
升级 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手动升级, 可以开启自动升级:
acme.sh --upgrade --auto-upgrade
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
二、证书签发
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
切换 Buypass
acme.sh --set-default-ca --server buypass
切换 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字符串
切换 SSL.com
acme.sh --set-default-ca --server ssl.com
切换 Google Public CA
acme.sh --set-default-ca --server google
2. 测试证书申请
在正式申请证书之前,我们先用测试命令(--issue --test
)来验证是否可以成功申请,这样可以避免在本地配置有误时,反复申请证书失败,超过 Let's Encrypt 的频率上限(比如,每小时、每个域名、每个用户失败最多 5 次),导致后面的步骤无法进行
测试证书申请的命令如下(本文均以 ECC 证书为例,因为时至今日,实在没什么理由不用它)
acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
说明
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
如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。
acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
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
说明
--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
仔细观察,你会发现这次给你发证书的域名是 https://acme-v02.api.letsencrypt.org
,少了 staging
,自然就是【正式服】了!
多域名证书申请
~/.acme.sh/acme.sh --issue -d bihell.com -d www.bihell.com --standalone -k ec-384 --force
DNS API 申请
阿里云通配域名申请
以阿里云域名为例,我们通过DNS进行验证。首先拿到阿里云的AccessKey
然后终端创建对应key的变量
# 将xxxxx替换成你自己的key
export Ali_Key="xxxxxxx"
export Ali_Secret="xxxxxxx"
执行以下语句申请证书
# 注意将域名改为你自己的
~/.acme.sh/acme.sh --issue --dns dns_ali -d bihell.com -d '*.bihell.com' -k ec-256 --force
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
通配域名配置
mkdir /data
~/.acme.sh/acme.sh --installcert -d bihell.com -d '*.bihell.com' --fullchainpath /data/dice.crt --keypath /data/dice.key --ecc
6. 更新证书
证书的有效期为 90 天,acme.sh 会 60 天更新(Renew)一次。
在安装 acme.sh 的时候就自动配置了一条 cron 任务了,会每天检查证书的情况。当然可以到 crontab 里看一下。
29 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
也可以试着用上面这条命令执行看一下相关的配置是否正确。
强制更新可以这样
acme.sh --renew -d example.com --force
acme.sh --renew -d example.com --force --ecc # 如果用的是ECC证书
7. 停止更新证书
# 查看证书列表
acme.sh --list
# 停止 Renew
acme.sh --remove -d example.com [--ecc]
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;
# ...
}
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";