使用acme.sh申请免费的HTTPS证书
最近把自己的网站从HTTP升级为HTTPS,在这里把过程及踩过的坑记录一下。
acme.sh是一个纯粹用Shell语言编写的脚本,本质上是一个实现了ACME协议的客户端,它足够简单,功能强大且易于使用,可以实现自动颁发、续订和安装证书,目前支持ZeroSSL、BuyPass、Let`s Encrypt等多种不同证书,本文使用的是ZeroSSL证书。
安装acme.sh
curl https://get.acme.sh | sh |
该安装脚本做了几件事:
- 把 acme.sh 安装到了 home 目录下:~/.acme.sh/
- 创建了一个 bash 的 alias, 方便使用: alias acme.sh=~/.acme.sh/acme.sh
- 创建了cronjob,每天 0:00点自动检测所有的证书,如果快过期了,则会自动更新证书。
可能会因为网络问题无法自动安装,则需要手动更改安装脚本内容:
# 下载并保存脚本 |
或者直接手动安装:
git clone https://github.com/acmesh-official/acme.sh.git |
注册 ZeroSSL 账号
申请证书之前建议先去ZeroSSL官网注册账号,ZeroSSL官网地址:https://zerossl.com
也可以直接使用以下命令来注册,如果已经在官网注册,该命令会自动关联账户,邮箱改为你自己的ZeroSSL邮箱,一定不要随便填。
acme.sh --register-account -m myemail@example.com --server zerossl |
将 acme.sh 的注册服务器改为 ZeroSSL
如果你的acme.sh 是2.x版本,默认使用Let`s Encrypt作为服务提供商,我们可以通过以下命令,将其更换为ZeroSSL:
acme.sh --set-default-ca --server zerossl |
配置DNS API
本文使用 DNS 验证的方法来验证域名,acme.sh 可以通过 DNS 提供商的 API 自动设置验证记录,具体用法详见文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
常用的 CloudFlare 、 DNSPod 、 CloudXNS 、阿里云 等DNS服务都支持。
以阿里云为例,登录后台找到账号的秘钥(建议创建子账号来专门管理此功能):
如果你使用的是子账号,一定要给子账号开通以下权限:
接下来执行下面命令即可:
export Ali_Key="****************************" |
签发证书
以zmtupian.com为例,该域名使用阿里云解析,在上面的步骤中已经配置好阿里云DNS API
acme.sh --dns dns_ali --issue -d zmtupian.com -d *.zmtupian.com |
其中:
–dns 指定 DNS 服务商,dns_ali 代表阿里云,还有 dns_cf 代表 CloudFlare,更多的字段见 https://github.com/acmesh-official/acme.sh/tree/master/dnsapi
如果不使用 API 自动添加验证,则不用添加后续参数,如:acme.sh –issue –dns -d example.com ….
-d *.example.com 表示签发泛域名证书
执行命令之后看输出的内容可以确定证书所在位置,这时就签发成功了。
安装证书
acme.sh --install-cert -d zmtupian.com \ |
其中:
- –key-file 和 -fullchain-file 后接想要安装到的目录及证书名
- –reloadcmd 后接服务的重启命令,程序自动续期证书后会运行该命令使其生效,一定不能漏
默认情况下,证书将每60天更新一次(可配置),证书更新后,服务将通过reloadcmd设置的命令自动重新加载。
启用https服务
修改服务器的配置文件启用HTTPS,以nginx为例:
server { |
配置好后,检查是否有错误,然后重启服务器即可:
nginx -t |
最后,记得去服务器管理后台打开服务器443端口。
大功告成!






