使用acme.sh来自动更新https证书
使用 acme.sh 可以自动申请 let’s encrypt 证书,并且可以自动配置到 nginx,整个过程可以全自动。
也可以使用 certbot,certbot 基于 acme.sh使用certbot自动申请ssl证书
安装
推荐安装 socat
1 | sudo apt install socat |
安装 acme.sh
1 | curl https://get.acme.sh | sh |
退出终端,重新登陆后,执行 acme.sh 有输出,说明安装成功了。
配置邮箱
1 | acme.sh --register-account -m "iuxt@qq.com" |
配置默认 CA
新版默认 zerossl,也可以手动切换为 let’s encrypt
1 | # acme.sh --set-default-ca --server letsencrypt |
申请证书
acme.sh 实现了 acme 协议支持的所有验证协议.
一般有两种方式验证: http 和 dns 验证.
使用 dns api 自动申请
官方说明: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
DNSpod
这里以 dnspod 为例,申请一个 dnspod 的 api key
将 id 和 key 记录下来,执行
1 | export DP_Id="310134" |
执行一次就会把 id 和 key 记录在 ~/.acme.sh/account.conf
,下次再执行就不用再提供 id 和 key 了
1 | # 遇到问题可以查看debug日志 |
如果找不到 acme.sh, 可以使用绝对路径 ~/.acme.sh/acme.sh
cloudflare dns
获取 API 令牌
1 | export CF_Key="你的api key" |
使用 HTTP 认证
http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权, 完成验证. 然后就可以生成证书了.
1 | acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ |
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
如果你用的 apache 服务器, acme.sh 还可以智能的从 apache 的配置中自动完成验证, 你不需要指定网站根目录:
1 | acme.sh --issue -d mydomain.com --apache |
如果你用的 nginx 服务器, 或者反代, acme.sh 还可以智能的从 nginx 的配置中自动完成验证, 你不需要指定网站根目录:
1 | acme.sh --issue -d mydomain.com --nginx |
注意, 无论是 apache 还是 nginx 模式, acme.sh 在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置.
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个 webserver, 临时听在 80 端口, 完成验证:
1 | acme.sh --issue -d mydomain.com --standalone |
更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
安装证书
默认生成的证书都放在 ~/.acme.sh/
, 可以使用 --install-cert
命令, 将证书复制到指定的位置。
只有通过这种方式来复制证书,以后才能自动更新,手动复制的证书不能自动更新。
1 | export DOMAIN=babudiu.com |
1 | export DOMAIN=babudiu.com |
升级 acme.sh
手动升级
1 | acme.sh --upgrade |
也可以设置自动升级
1 | acme.sh --upgrade --auto-upgrade |
关闭自动更新
1 | acme.sh --upgrade --auto-upgrade 0 |
Nginx 证书配置的解释
文件名 | 内容 |
---|---|
cert.pem | 服务端证书 |
chain.pem | 浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书 |
fullchain.pem | 包括了 cert.pem 和 chain.pem 的内容 |
privkey.pem | 证书的私钥 |
错误排查
添加 --debug
参数,看看输出结果,都会很详细的说明问题原因。