通过 acme.sh 申请 Zero SSL 免费泛域名证书
Posted sp42a
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过 acme.sh 申请 Zero SSL 免费泛域名证书相关的知识,希望对你有一定的参考价值。
就是白嫖,而且理论上是无限的……中间有些坑,来看看我怎么踩!
如果不是泛域名的,Let’s Encrypt、Zero SSL 这类免费证书意义不大,——都去阿里云、腾讯云申请免费一年证书好了。
安装
acme.sh 是 shell 脚本,我们从 github 下载回来并安装。执行以下脚本
curl https://get.acme.sh | sh -s email=youremail@xx.com
国内因为众所周知的关系,访问 github 总不是那么顺畅,有时会报错,
但没关系,多试几次总可以的。成功安装提示如下。
测试一下是否安装成功 acme.sh --version
:
关联 ZeroSSL
目前 acme.sh 支持四个正式环境 CA,分别是 Let’s Encrypt、Buypass、ZeroSSL 和 SSL.com,默认使用 ZeroSSL,所以我们不用切换。如果不放心,可以设置一下,
acme.sh --set-default-ca --server zerossl
接着注册一个 ZeroSSL 账号 :https://zerossl.com/。然后关联到 acme
(据网友说 不注册也行,仅提供一个邮箱即可,但这安全性不高)
acme.sh --register-account -m 你注册时用的邮箱地址 --server zerossl
为了让 Zero 官网显示已颁发证书,你可能要用 ZeroSSL API Key 来关联 acme(这样的话有 Web 界面比较好管理,知道几时快过期)。访问 https://app.zerossl.com/developer 获取 API Key。
acme.sh --register-account --server zerossl \\
--eab-kid 你的eab-kid \\
--eab-hmac-key 你的eab-hmac-key
申请颁发证书
我们的 Web 服务器在同一台机器上,于是采用 webroot 模式来验证域名的所有权。
acme.sh --issue -d xxx.com -w /home/wwwroot/example.com
这里需要指定域名,并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录,然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。
当然了这要求 Web 服务的 80 端口在跑。
如上图表示申请成功。我的服务器是 Tomcat 的,前端 80 端口重定向到 443 端口(旧的其他 HTTPS 证书),acme 的验证也能识别 HTTP 301 重定向。
注意这种不是泛域名的,是单域名的,只是先练手测试下!
查看已安装证书信息
acme.sh --info -d example.com
更新证书
这是自动的,查看定时任务
crontab -l
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
泛域名证书
遗憾的是 wwwroot 模式并不能申请泛域名证书。那这三个月的 Zero 证书有什么用?还不如去申请阿里云、腾讯云免费一年的证书:(
要使用泛域名证书,得采用 DNS 模式验证。这是政策所限定的,无法突破,无论 Zero 还是 Let’s Encrypt。
我的是新网的,貌似不支持 DNS API——对此,你可以选择:
- 使用 DNS alias mode
- 修改域名 DNS 为可以支持 DNS API 的服务商,例如 新网注册域名如何配置为 DNSPod 的 DNS 服务器
- 手动验证,每次手动添加 txt 验证,太反人类,不搞!
停止续签
这不是泛域名的,于是停止自动更新续签,输入命令:
acme.sh --remove -d example.com
太难了 :)我已经放弃了……
DNSPod
我不甘心,还想搞泛域名,既然新网不支持 DNS Api,那就把 DNS 切到别的,例如 DNSPod。
DNSPod 高档货当然有 DNS API,而且是免费的。DNS API 就是做这个的,添加 txt record 解析验证用,一切自动。
首先从新网迁出来(不是迁移域名,仅仅是 DNS):
然后 DNSPod 里面选择“取回域名”,再加一条 txt 验证一下。
OK 之后,你在 DNSPod 可以看到迁入成功
然后申请 DNS API Token,就是允许人家凭这 Token 任意修改你的域名解析,所以有一定泄漏安全性的风险。进入账号中心->密钥管理:
记得要保存好秘钥的 ID 和 Token,后面的步骤需要用到这两个配置。
回到你的服务器,Linux,在服务器的环境变量中添加这两个值:
export DP_Id="你的ID"
export DP_Key="你的Token"
接着使用 acme.sh 申请签发证书,执行命令(注意 -d XXX.com -d *.XXX.com
分别两个域名,后者带通配符的是泛域名):
acme.sh/acme.sh --issue --dns dns_dp -d XXX.com -d *.XXX.com
等待一阵,如无意外就 OK。
其中,fullchain.cer
就是证书文件内容,而 xxx.key
就是证书的私钥。
DNS alias 模式
为了解决域名服务商没有 DNS API 的问题,也为了更高的安全性,可以使用 DNS Alias 模式来验证。原文说得好:
If your DNS provider doesn’t support API access, or if you’re concerned about security problems from giving the DNS API access to your main domain, then you can use DNS alias mode. For example, your main domain is example.com, which doesn’t have API access, or you don’t want to give the API access to acme.sh, since it’s important. And you have another domain: aliasDomainForValidationOnly.com, which has a supported DNS API. This domain is less important, and maybe it’s used for validation only.
首先做 CName 映射,在要申请证书的域名加上 cname 解析,映射到有 DNS API 的域名:
_acme-challenge.A.com
=> _acme-challenge.B.net
注意:
- 这条 CName 解析要留着,以便以后 renew 要用到。
- B.net 域名不需要你手动去增加 _acme-challenge 的指向,因为你已经应用这个域名的 DNS API 了,acme 会自动操作。
接着就可以颁发了
acme.sh --issue -d A.com -d *.A.com --challenge-alias B.net --dns dns_dp
如果出现下面错误 Not valid yet, let’s wait 10 seconds and check next one.
你要清除 B.net 上面多余的 txt 记录。
另外有个疑问,一般教程都说 两个 域名 -d A.com
和泛域名 -d *.A.com
,但感觉泛域名已经包含了前者,申请一个就行了。DNA Alias 的时候我分开两次颁发的,使用却只是后者,所以感觉 要两个一起申请,不然的话:-d A.com
没必要,——但又不确定。
总体来说,这个操作过程没有什么难度。但是要理解各项操作对应的规范、原理就比较困难了。
参考
以上是关于通过 acme.sh 申请 Zero SSL 免费泛域名证书的主要内容,如果未能解决你的问题,请参考以下文章
通过 acme.sh 申请 Zero SSL 免费泛域名证书
用acme.sh申请免费ssl证书-let's encrypt
用acme.sh申请免费ssl证书-let's encrypt
用acme.sh给网站域名,申请免费SSL永久证书(自动续期)