0.引言 众所周知,2025年的一个网站必须有TLS证书(别杠,我说的是普遍情况和事实标准,不是技术强制要求),申请证书有免费有付费,在ACME(Automated Certificate Management Environment/自动证书管理环境) 协议标准发布后,主要的各大CA都兼容了这些协议,自动签发SSL/TLS证书,支持HTTP-01和DNS-01等 挑战(英文表述为”challenge” ,实际操作为验证域名的控制权) 方式,本文使用DNS-01挑战申请证书。
1.安装acme.sh 提醒:本节操作在Linux环境下运行,如果是Windows或其它系统请自行安装
安装很简单,直接打开终端敲这行命令:
1 curl https://get.acme.sh | sh -s email=you@example.com
提示:安装时请把邮箱换成你自己的,尽管你直接复制我的命令也能申请就是 终端输出如下,如果你看到的输出像我这样,就说明安装成功了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 naki@naki-im:~$ curl https://get.acme.sh | sh -s email=me@naki.im % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1032 0 1032 0 0 1377 0 --:--:-- --:--:-- --:--:-- 1379 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 226k 100 226k 0 0 244k 0 --:--:-- --:--:-- --:--:-- 244k [2025年 12月 13日 星期六 23:41:28 CST] Installing from online archive. [2025年 12月 13日 星期六 23:41:28 CST] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz [2025年 12月 13日 星期六 23:41:31 CST] Extracting master.tar.gz [2025年 12月 13日 星期六 23:41:31 CST] It is recommended to install socat first. [2025年 12月 13日 星期六 23:41:31 CST] We use socat for the standalone server, which is used for standalone mode. [2025年 12月 13日 星期六 23:41:31 CST] If you don't want to use standalone mode, you may ignore this warning. [2025年 12月 13日 星期六 23:41:31 CST] Installing to /home/naki/.acme.sh [2025年 12月 13日 星期六 23:41:31 CST] Installed to /home/naki/.acme.sh/acme.sh [2025年 12月 13日 星期六 23:41:31 CST] Installing alias to ' /home/naki/.bashrc' [2025年 12月 13日 星期六 23:41:31 CST] Close and reopen your terminal to start using acme.sh [2025年 12月 13日 星期六 23:41:31 CST] Installing cron job [2025年 12月 13日 星期六 23:41:31 CST] bash has been found. Changing the shebang to use bash as preferred. [2025年 12月 13日 星期六 23:41:34 CST] OK [2025年 12月 13日 星期六 23:41:34 CST] Install success! # 注意这行,出现就是安装成功了
2.开始上手使用 2.1 坑点 “我问你,安装完成了,那我直接敲acme.sh能调用了吧?”——一个不愿透露姓名的提问者 “对不起,不行,看这个”
1 2 naki@naki-im:~$ acme.sh bash: /usr/local/bin/acme.sh: 没有那个文件或目录
这是你安装时不得不品的一环,因为你安装acme.sh的时候它默认安装到你的家目录下,而用户的home目录不在Linux系统的$PATH变量里面,证据如下:
1 2 3 naki@naki-im:~$ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
追问:那咋整?难道我每次都要加路径么? 答:不需要的,一个 符号链接(symbolic link/symlink) 即可
1 2 3 naki@naki-im:~$ ln -sf ~/.acme.sh/acme.sh /usr/local/bin/acme.sh [sudo ] naki 的密码: naki@naki-im:~$
完事了,你就可以直接调用无需再补路径了。原理:通过Linux系统的符号链接(symbolic link/symlink)机制实现把acme.sh的入口放在$PATH变量内的目录从而全局调用,符号链接在常规的调用中被视为一个普通的文件,系统会自动将文件内容重写到符号链接指向的文件
2.2 需要准备的项目 继续操作之前,请确保你准备好了这些项目,用来填写配置文件
一个有效的email地址 DNS服务商的API Token(本文以Cloudflare为例,acme.sh支持的服务商数量众多,详见此处配置其它DNS服务商的配置 )并确保其有足够的权限,覆盖到每一个要申请证书的域名(具体为读权限和写权限) 至少一个准备申请证书的域名,权威NS服务器在你的服务商处 2.3 设置配置文件 acme.sh已经能够访问到了,但我们是来申请证书的不是来敲命令行玩的,要申请东西就要填写申请信息这道理是个人都知道,照我这么写,实测正常申请
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 账户邮箱 ACCOUNT_EMAIL='you@example.com' # 默认CA,设置为Let‘s Encrypt DEFAULT_CA="letsencrypt" # 密钥长度 ACCOUNT_KEY_LENGTH=2048 # 设置证书为EC384提升应用性能,如果需要兼容性可改为rsa-2048 CERT_KEY_LENGTH=ec-384 # 日志级别 LOG_LEVEL=2 # 默认服务器(自动生成的) DEFAULT_ACME_SERVER='https://acme-v02.api.letsencrypt.org/directory' # 设置Cloudflare的API Token SAVED_CF_Token='<此处填写你Cloudflare API Token>' # 账户ID,这个不用写也可以工作 SAVED_CF_Account_ID='' # 这个我也不知道干嘛的 USER_PATH='/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games'
3.申请证书 恭喜你,完成了所有针对acme.sh的配置,接下来正式开始申请TLS证书 配置文件敲好了,直接申请证书就行,命令如此所示,示例为申请单个域名的通配符证书,如果你需要申请多个域名可以接着添加域名
1 acme.sh --issue --dns dns_cf -d 987632.xyz -d *.987632.xyz
3.1 坑点 你需要准备这些,否则可能导致证书申请失败
一个稳定的网络环境,我就因为这个被坑过,证据见下文 用途:确保连接Let’s Encrypt的ACME端点时的连接稳定 CA的授权文件,即EAB(但Let’s Encrypt不需要EAB,如果你后期要换用其它家的CA需要确认其对EAB的要求情况) 看,我就这么被坑的: 1 2 3 4 5 6 7 8 9 10 naki@naki-im:~$ acme.sh --issue --dns dns_cf -d 987632.xyz -d *.987632.xyz --keylength ec-384 --force [2025年 12月 12日 星期五 23:11:21 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory [2025年 12月 12日 星期五 23:11:22 CST] Multi domain='DNS:987632.xyz,DNS:*.987632.xyz' [2025年 12月 12日 星期五 23:11:53 CST] Getting webroot for domain='987632.xyz' [2025年 12月 12日 星期五 23:11:53 CST] Getting webroot for domain='*.987632.xyz' [2025年 12月 12日 星期五 23:11:55 CST] Adding TXT value: 0HpYepgVo9X40ovImXHtrgLKSOagT6EBnpxsN3Dl874 for domain: _acme-challenge.987632.xyz [2025年 12月 12日 星期五 23:12:00 CST] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35 [2025年 12月 12日 星期五 23:12:00 CST] error zones?name=_acme-challenge.987632.xyz [2025年 12月 12日 星期五 23:12:00 CST] invalid domain [2025年 12月 12日 星期五 23:12:00 CST] Error adding TXT record to domain: _acme-challenge.987632.xyz [2025年 12月 12日 星期五 23:12:00 CST] Please add '--debug' or '--log' to see more information. [2025年 12月 12日 星期五 23:12:00 CST] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
3.2 申请完成 经过安装、配置、调试之后,申请流程之后,TLS证书应该申请成功了,输出大致如这样:
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 naki@naki-im:~/docs/naki.im/hexo-butterfly$ acme.sh --issue --dns dns_cf -d 987632.xyz -d *.987632.xyz [2025年 12月 14日 星期日 00:34:38 CST] Using CA: https://acme-v02.api.letsencrypt.org/directory [2025年 12月 14日 星期日 00:34:38 CST] Creating domain key [2025年 12月 14日 星期日 00:34:38 CST] The domain key is here: /home/naki/.acme.sh/987632.xyz_ecc/987632.xyz.key [2025年 12月 14日 星期日 00:34:39 CST] Multi domain='DNS:987632.xyz,DNS:*.987632.xyz' [2025年 12月 14日 星期日 00:34:43 CST] Getting webroot for domain='987632.xyz' [2025年 12月 14日 星期日 00:34:43 CST] Getting webroot for domain='*.987632.xyz' [2025年 12月 14日 星期日 00:34:44 CST] 987632.xyz is already verified, skipping dns-01. [2025年 12月 14日 星期日 00:34:44 CST] *.987632.xyz is already verified, skipping dns-01. [2025年 12月 14日 星期日 00:34:44 CST] Verification finished, beginning signing. [2025年 12月 14日 星期日 00:34:44 CST] Let's finalize the order. [2025年 12月 14日 星期日 00:34:44 CST] Le_OrderFinalize=' https://acme-v02.api.letsencrypt.org/acme/finalize/2873092546/458448149496' [2025年 12月 14日 星期日 00:34:46 CST] Downloading cert. [2025年 12月 14日 星期日 00:34:46 CST] Le_LinkCert=' https://acme-v02.api.letsencrypt.org/acme/cert/06fe7c90aff16aa21790852ad442bd197e81' [2025年 12月 14日 星期日 00:34:49 CST] Cert success. -----BEGIN CERTIFICATE----- MIIDlTCCAxugAwIBAgISBv58kK/xaqIXkIUq1EK9GX6BMAoGCCqGSM49BAMDMDIx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF NzAeFw0yNTEyMTMxNTM2MTVaFw0yNjAzMTMxNTM2MTRaMBUxEzARBgNVBAMTCjk4 NzYzMi54eXowWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ3Ybdl2YvqbzBBk6Oa LD80FyMUojxVL72eBVrdCXVhhTLfKf0Dfq7lhPT2Go3ql9wV9csECwd1NDbe8xiR 5Dlro4ICLDCCAigwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMB BggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTLf0PEF6M4kVjq+0Ys A0j0JiNAWjAfBgNVHSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEF BQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wIwYD VR0RBBwwGoIMKi45ODc2MzIueHl6ggo5ODc2MzIueHl6MBMGA1UdIAQMMAowCAYG Z4EMAQIBMCwGA1UdHwQlMCMwIaAfoB2GG2h0dHA6Ly9lNy5jLmxlbmNyLm9yZy8y LmNybDCCAQsGCisGAQQB1nkCBAIEgfwEgfkA9wB2AA5XlLzzrqk+MxssmQez95Df m8I9cTIl3SGpJaxhxU4hAAABmxiQkGAAAAQDAEcwRQIhAN5jHBZl9osORcQLxLMP lqUylaHbShzxsaaCDu48Y1V9AiBcrtL6BM25zXbFC2uPaxXaO5/983pn2Neo5Vj2 kzQ5+gB9AHF+lfPCOIptseOEST0x4VqpYgh2LUIA4AUM0Ge1pmHiAAABmxiQkNwA CAAABQAEEGd7BAMARjBEAiBhRq0uvQBSxnRbCRAT5LiB5ZhMRUe1H5gEql9ANqql /AIgSniHnT5xrIMZznuy8rr5RhfskfKYwB20Z95PSkRqaH4wCgYIKoZIzj0EAwMD aAAwZQIxAK1GzZrGz53CxMM2KiRlCf0uOCre5smA8nX0qdqGMhFvs5m/0mtWEytb YvLbQVrOzwIwAp+8AUfyhY6WGoBsIhMxw188Xjz8ydKgQClm7xnK5llqoMCQCH0P 9eKFFAkvHFI6 -----END CERTIFICATE----- [2025年 12月 14日 星期日 00:34:49 CST] Your cert is in: /home/naki/.acme.sh/987632.xyz_ecc/987632.xyz.cer [2025年 12月 14日 星期日 00:34:49 CST] Your cert key is in: /home/naki/.acme.sh/987632.xyz_ecc/987632.xyz.key [2025年 12月 14日 星期日 00:34:49 CST] The intermediate CA cert is in: /home/naki/.acme.sh/987632.xyz_ecc/ca.cer [2025年 12月 14日 星期日 00:34:49 CST] And the full-chain cert is in: /home/naki/.acme.sh/987632.xyz_ecc/fullchain.cer
acme.sh会直接把证书的内容输出到终端,如果要读取密钥,则需要从输出中找到密钥文件的路径,使用cat命令或使用文本编辑器打开查看。
4.完成 恭喜你,你又学会了个新技能:使用acme.sh申请TLS证书 至于这玩意的用途……建站是需要TLS证书的,但托管平台会自动给你申请,如果有需要设置自定义证书就能把这玩意派上用场。