参考来源
1.https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
2.https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode
3.https://github.com/acmesh-official/acme.sh/wiki/dnsapi
安装 acme.sh + 配置账号 + 配置默认CA
安装依赖
# Centos/RedHat安装依赖命令
yum update && yum install curl -y && yum install cron -y && yum install socat -y
# Debian/Ubuntu安装依赖命令
apt-get update && apt-get install curl -y && apt-get install cron -y && apt-get install socat -y
安装 acme.sh
执行如下命令安装 acme.sh,acme.sh默认安装到 home 目录下的 ~/.acme.sh/ 目录
curl https://get.acme.sh | sh
安装完成后验证 acme.sh 版本,正常输出版本则说明安装成功
acme.sh --version
[root@localhost .acme.sh]# acme.sh --version
https://github.com/acmesh-official/acme.sh
v3.1.0 #这是我的,说明 acme.sh 版本是v3.1.0
注意:如果安装完成后提示 -bash: acme.sh: command not found,需要手动执行 source ~/.bashrc
配置 acme.sh 账号
将 your-mail@mail.com 替换成自己的邮箱执行如下命令,如果未注册会自动注册的,已注册也不影响
acme.sh --register-account -m your-mail@mail.com
配置或修改默认 CA
acme.sh 实现了 acme 协议,支持从 ZeroSSL,Let’s Encrypt 等 CA 生成免费的证书,可以按需选择 CA
# 修改默认 CA 为 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
# 修改默认 CA 为 ZeroSSL
acme.sh --set-default-ca --server zerossl
acme.sh 脚本默认 CA 服务器是 ZeroSSL,有时可能会导致获取证书的时候一直出现:Pending,The CA is processing your order,please just wait.
只需要把 CA 服务器改成 Let’s Encrypt 即可,虽然更改以后还是有概率出现 pending,但基本 2-3 次即可成功
签发证书
acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: HTTP 和 DNS 验证。
HTTP 验证
指定 webroot 直接签发(签发 Let’s Encrypt 更稳定)
只需要指定域名,并指定域名所在的网站根目录 webroot. acme.sh 会全自动的生成验证文件,并放到网站的根目录,验证完成后会自动删除验证文件,整个过程没有任何副作用。
acme.sh --issue -d example.com.com -d www.example.com --webroot /home/wwwroot/example.com.com/
使用 Apache、Nginx 模式(使用 ZeroSSL 可能会失败,使用 Let’s Encrypt 可以)
如果你用的 Apache、Nginx 服务器,acme.sh 还可以智能的从 Apache、Nginx的配置中自动完成验证,你不需要指定网站根目录。
# 使用 Apache 模式
acme.sh --issue --apache -d example.com -d www.example.com
# 使用 Nginx 模式
acme.sh --issue --nginx -d example.com -d www.example.com
注意(参考):
- 无论是 Apache 还是 Nginx 模式,acme.sh 在完成验证之后,会恢复到之前的状态,都不会私自更改程序本身的配置. 好处是你不用担心配置被搞坏,也有一个缺点,需要自己配置 SSL 项,否则只能成功生成证书,你的网站还是无法正常使用 HTTPS。
- 使用 ZeroSSL 不稳定,使用Let’s Encrypt 可以,此时可以使用 acme.sh --set-default-ca --server letsencrypt 修改默认CA
- HTTP 验证不支持签发泛解析域名
使用独立服务模式(使用 ZeroSSL、Let’s Encrypt 均可以)
如果服务器上没有运行任何 Web 服务,80 端口是空闲的,那么 acme.sh 还能假装自己是一个 WebServer,临时监听 80 端口,完成验证。
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com
更高级的用法请参考: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
DNS 验证- 推荐
手动验证 DNS
需要你手动在域名上添加一条 TXT 解析记录,验证域名所有权。
注意,如果使用手动验证,acme.sh 将无法自动更新证书,每次都需要手动添加解析来验证域名所有权。如果有自动更新证书的需求,请使用自动验证(DNS API)。
1.获取验证 DNS 解析记录值
执行如下命令后acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 TXT 记录即可
acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
2.添加 TXT 记录
域名在哪购买的,就在那个平台就在哪个平台配置解析
3.生成证书
DNS解析生效后,执行如下命令重新生成证书,注意这里现在用的是 –renew 参数,证书生成后回输出对应的存放路径的
acme.sh --renew -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
自动验证 DNS(DNS API)
腾讯-DNSPod
1.获取 DNSPod 的 API ID 和 Token
登录到 DNSPod.cn (https://console.dnspod.cn/account/token/token),拿到 DNSPod 的 API ID 和 Token,参考截图
2.将 DNSPod 的 API ID (就是 DP_Id) 和 Token (就是 DP_Key) 加入环境变量
export DP_Id="xxxx"
export DP_Key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
运行申请证书脚本后 DP_Id 和 DP_Key 将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。
3.运行 acme.sh 申请证书
acme.sh --issue --dns dns_dp -d example.com -d *.example.com
阿里云-万网
1.获取 Aliyun 的 AccessKey ID 和 AccessKey Secret
登录 Aliyun RAM 访问控制 (https://ram.console.aliyun.com/users/create),拿到 Aliyun 的 AccessKey ID 和 AccessKey Secret,参考截图
添加管理DNS解析的权限(AliyunDNSFullAccess)
2.将 AccessKey ID(就是 Ali_Key) 和 AccessKey Secret(就是 Ali_Secret) 加入环境变量
export Ali_Key="xxxxxxxxxxxxxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
运行申请证书脚本后 Ali_Key 和 Ali_Secret 将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。
3.运行 acme.sh 申请证书
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
其他 DNS 平台
参考:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
命令执行完成后,会输出证书存放路径的,生成的证书参考截图。