本文记录如何通过acme.sh生成免费SSL证书并自动续期。
一、acme.sh简介
acme.sh 实现了 acme 协议, 可以从 Let’s Encrypt 等平台生成免费的证书.
acme.sh的Github项目地址
https://github.com/acmesh-official/acme.sh |
Let’s Encrypt 是一家免费、开放、自动化的公益性证书颁发机构(CA)。
二、安装 acme.sh
curl https://get.acme.sh | sh -s email=my@example.com |
或者
wget -O - https://get.acme.sh | sh -s email=my@example.com |
my@example.com替换成自己的邮箱
安装成功后,在 root 目录下 ls -a 就可以看到有一个.acme.sh的文件夹
创建一个别名方便使用:
alias acme.sh=~/.acme.sh/acme.sh |
安装时已经为系统创建crontab定时任务,续签证书的调度任务,自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书,可以通过 crontab -l 查看。
安装过程中所有的修改都限制在安装目录~/.acme.sh/中,因此不用担心对已有的系统任何功能和文件污染。
三、生成证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。
1. http 方式
需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了。
acme.sh --issue -d example.com -w /home/wwwroot/example.com |
或者
acme.sh --issue -d example.com -w /home/username/public_html |
或者
acme.sh --issue -d example.com -w /var/www/html |
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用。
如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --apache |
如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --nginx |
注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置。
acme.sh脚本默认ca服务器是zerossl,如果经常出错可以切换到其他服务器:
切换 Let’s Encrypt
acme.sh --set-default-ca --server letsencrypt |
切换 ZeroSSL
acme.sh --set-default-ca --server zerossl |
切换 SSL.com
acme.sh --set-default-ca --server ssl.com |
切换 Google Public CA
acme.sh --set-default-ca --server google |
支持同时为多个域名生成证书
acme.sh --issue -d example.com -d www.example.com -d cp.example.com -w /home/wwwroot/example.com |
2、dns方式
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证。
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。
(1)登录到阿里云账号, 生成你的 api id 和 api key,然后进行配置
export Ali_Key="<key>" |
如果是其他平台可以在Github查看使用文档
(2)生成证书
这里以生成泛域名的证书为例(如果只需要生成一个域名的,直接一个-d接上域名即可)
acme.sh --issue --dns dns_ali -d example.com -d *.example.com |
如果是DNSPod解析示例如下
export DP_Id="1234" |
四、安装证书
1、创建存放证书的文件夹
mkdir -p /etc/nginx/ssl/edu.lovehistory.top |
2、安装证书
acme.sh --install-cert -d edu.lovehistory.top \ |
第一行中的edu.lovehistory.top为申请SSL证书的域名
五、配置SSL证书
在nginx目录下的conf文件的server模块配置SSL证书
server { |
配置HTTP自动重定向到HTTPS(可选)
server { |
也可以配置HTTPS自动重定向到HTTP:
server { |
六、更新证书
安装acme.sh后,所有证书将每60天自动更新一次。
但是,您也可以强制更新证书:
acme.sh --renew -d example.com --force |
七、升级acme.sh
acme.sh 正在不断开发,因此强烈建议使用最新的代码。
您可以将 acme.sh 更新到最新代码:
acme.sh --upgrade |
您还可以启用自动升级:
acme.sh --upgrade --auto-upgrade |
然后acme.sh将自动保持更新。
禁用自动升级:
acme.sh --upgrade --auto-upgrade 0 |