我们都知道 freessl 可以免费的获得最长一年的 SSL 证书。但是这个网站的证书到期以后需要重新申请、更换。这个操作其实是有点烦的。

acme.sh 就可以解决这个问题

acme.sh 实现了 acme 协议,可以从 lets encrypt 生成免费的证书。

2023.09.23 补充:时间过得真快,acme.sh 已经更新了新的版本,安装和使用方法也都有点差别,务必阅读原汁原味的英文文档哦~

acme.sh

中文文档
原汁原味的英文文档

它在大多数的服务器系统上都可以使用。是一个很好用的证书签发脚本。
同时,他还能为你的证书自动续期。至于什么时候续、怎么续,都不需要你来关心,因为这一切都是自动的。

usage

安装

使用 root 用户或者有 root 权限的用户安装

curl  https://get.acme.sh | sh

安装完成后,为程序设置别名

alias acme.sh=~/.acme.sh/acme.sh

以后就可以直接使用 acme.sh 作为这个程序的别名来使用了(相当于快捷方式)。

用 DNS 签发和续期

acme.sh 支持大多数的 dns,国内的阿里云、DNSPOD 等均已得到支持。以 DNSPOD 为例,

生成 apiKey 和 ID

登录自己的 DNSPOD,点击右上角的头像弹出菜单,选择“密钥管理”。添加一个密钥,把生成的密钥记录下来。这个密钥只会显示一次,所以要自己保存。

配置环境变量

直接在 CLI 执行下面两条命令,把引号中的内容换成你自己的 id 和 token

export DP_Id="341235"
export DP_Key="1aa994c91fc86b7f4c86cb66fba30416"

签发证书

使用 dns_dp 参数配置为自动模式,将以下两个域名(主域名和泛域名)配置签发证书。

acme.sh --issue --dns dns_dp -d mitkimi.com -d *.mitkimi.com

配置证书

如果你跟我一样使用了 nginx,那么就可以在 server 里配置,参考吃瓜:网站或者服务应该怎么部署? 的最后几段。

acme.sh 会把证书签发到 /root/.acme.sh/你的域名 目录下。例如 /root/.acme.sh/mitkimi.com

证书签发后,就要安装到网站配置中了
在你的 nginx 目录下新建一个 certs 目录,进入此目录,再新建一个你的网站域名的文件夹(我觉得这样比较优雅)

cd /etc/nginx
mkdir certs
cd certs
mkdir mitkimi.com

暂定在 /etc/nginx/certs/mitkimi.com 目录下存放你的证书。那么在 nginx 中配置证书时就要指向这里。

然后回到 acme.sh 的目录(如果你有别名,就不必了)
然后安装证书

acme.sh --install-cert -d mitkimi.com --cert-file /etc/nginx/certs/mitkimi.com/cert --key-file /etc/nginx/certs/mitkimi.com/key --fullchain-file /etc/nginx/certs/mitkimi.com/fullchain  --reloadcmd "service nginx reload"

这段命令制定了域名和拷贝文件目标,最后还有 reload nginx 的命令

acme.sh 还支持使用 nginx 等其他形式去配置。但我觉得用 dns 是最简单的,只要第一次配置过,以后的新配置全程一行命令,无需手动干预,是一个优雅的配置方式。