acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.
1. 安装 acme.sh
直接安装
curl https://get.acme.sh | sh -s email=my@example.com
国内可以用这个地址:
##克隆相关脚本
git clone https://gitee.com/neilpang/acme.sh.git
##进入到acme.sh目录
cd acme.sh
##执行设置通知邮箱,官方现在要求先设置邮箱
sh acme.sh --register-account -m email=xxx@emxmaple.com
官方现在默认使用的是ZeroSSL的证书,不过我在验证证书配置的时候一直有问题,因此我换成了Letsencrypt.org证书
##切换默认证书配置
sh acme.sh --set-default-ca --server letsencrypt
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
- 把 acme.sh 安装到你的 home 目录下:
~/.acme.sh/
并创建 一个 shell 的 alias, 例如 .bashrc,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
- 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
2. 生成证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.
- http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
注意:对于通配符证书需要加* -d 域名 -d *.域名 两个参数-w 即webroot,为该 域名 通过http所访问到的本地目录上面这段过程将会在 /home/wwwroot 创建一个 .well-known 的文件夹,同时 Let’s Encrypt 将会通过你要注册的域名去访问那个文件来确定权限,它可能会去访问 www.mydomain.com/.well-known… 这个路径,验证成功会自动清理。
- 手动 dns 方式, 手动在域名上添加一条 txt 解析记录, 验证域名所有权.
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
acme.sh --issue --dns -d mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please
以阿里云举例,更换为阿里云的配置(阿里云的密钥从ram.console.aliyun.com/users):
##先设置里有的相关key
export Ali_Key=XXX
export Ali_Secret=XXX
##执行阿里云相关DNS解析并生成证书(支持范域名*.mydomin.com)
sh acme.sh --issue --dns dns_ali -d mydomin.com -d *.mydomin.com --debug
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.其他服务商详情在:(其他云服务器相关配置在:github.com/acmesh-offi…
3.证书存储设置指定路径并自动续期
nginx举例
##路径替换为真实证书路径地址,reloadcmd替换为重启服务命令
sh acme.sh --install-cert -d mydomin.com \
--key-file XXX/cert/mydomin.com.key \
--fullchain-file XXX/cert/mydomin.com.cer \
--reloadcmd 'docker exec -it nginx nginx -s reload'
在nginx相关配置文档中替换相关配置
##在证书配置部分,设置成刚才的路径
...
ssl_certificate XXX/cert/mydomin.com.cer;
ssl_certificate_key XXX/cert/mydomin.com.key;
...
查看定时任务
##看是否有续期任务acme.sh
crontab -l