本文最后更新于 超过 2 年前,文中所描述的信息可能已发生改变。
为什么选择ACME
要想通过 TLS 访问自己域名下的服务, 就必须申请证书。类似宝塔这种面板提供了简单快捷的方法一键申请, 但终究不是良好的解决方案。一来宝塔过于臃肿, 二来其需要手机实名验证。使用各大云服务商提供的【免费证书】则还需要登录网页、申请、导入证书, 未免操作繁琐。更何况这些云服务商提供的证书只能给你很少的自由选择性。
而ACME则很好地解决了这些问题。
系统环境: Debian
准备工作与脚本安装
在开始之前, 首先将域名解析到服务器的ip上。
安装
首先安装socat, 它是acme所需的组件
apt update
apt install socat -y
然后安装acme脚本
curl https://get.acme.sh | sh
脚本安装在用户目录下的.acme.sh
(隐藏)文件夹内, 使用 . .bashrc
让acme.sh命令生效
接下来使用脚本申请证书
证书申请
首先注册CA账户, 将下列命令中的邮箱改为自己的邮箱地址
acme.sh --register-account -m xxxx@xxxx.com
注册成功的输出结果如下
_注册成功
然后申请证书, 接下来的方法有多种, 根据自己情况选择可用的一种即可
监听80端口申请证书
如果服务器的80端口空闲, 且能够访问, 可以让acme临时监听80端口, 完成验证。执行以下命令即可。将domain.com改为自己的域名
acme.sh --issue -d domain.com --standalone
通过Nginx服务申请
如果服务器上已经安装了nginx, 且网页能够正常打开, 执行以下命令即可通过nginx验证并申请证书。
acme.sh --issue -d mydomain.com --nginx
如果成功申请了证书, 将会看到的输出结果是一长串自己的证书和证书文件存放路径。
安装证书到指定路径
生成的证书文件默认存放在与acme.sh脚本相同文件夹内, 大多数情况下不应直接使用该路径下的证书文件, 而使用以下命令安装证书到指定路径。
acme.sh --install-cert -d domain.com --key-file <path>privkey.pem --fullchain-file <path>fullchain.pem
其中--key-file <path>privkey.pem
指定的为私钥文件, --fullchain-file <path>fullchain.pem
为证书文件。
done
善后工作
在安装acme.sh脚本时, 它自动为创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。 但由于acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也应当经常更新以保持同步。参考以下命令
acme.sh --upgrade --auto-upgrade #开启acme的自动更新
acme.sh --upgrade --auto-upgrade 0 #关闭自动更新