acme.sh
是一个利用ZeroSSL
和 Let's Encrypt
等受信任证书颁发机构(CA)自动化提供免费 SSL/TLS 证书的工具,可以用来部署 HTTPS,比certbot
还要好用。
单域名SSL证书只能对指定的域名部署HTTPS,比如你对域名example.com
部署了单域名SSL证书,test.example.com
还得再申请一个新的单域名SSL证书来部署HTTPS。
泛域名证书可以对*.example.com
的所有子域名提供部署HTTPS,只需要一个SSL证书就可覆盖所有example.com
下的子域名,如:test.example.com
、abc.example.com
等。
正常来说可以在任何主流操作系统中使用,以下教程示例是在Linux环境中进行。
① 命令方式下载:
最方便的方式是使用以下命令安装
curl https://get.acme.sh | sh
但该方式使用的源是Github
,没有科学上网可能会导致无法下载,可以通过访问国内的Gitee
下载。
② 国内源Gitee手动下载:
Gitee地址:https://gitee.com/neilpang/acme.sh
使用Git克隆仓库文件到本地,或直接下载zip到本地后上传到你的服务器,反正最终的效果就是你要把这个仓库里的每一个文件都要弄到你的服务器中去。
这两个应用是acme.sh
依赖的,如果没有的话安装acme.sh
时会警告。
apt update && apt install cron -y && apt install socat -y
进入下载下来的acme.sh
文件夹根目录执行以下命令:
./acme.sh --install
重新加载环境变量(或重新登录),不重新加载的话无法使用acme.sh
命令。
下面的命令只需要执行其一即可,根据自己的情况:
source ~/.bashrc # 适用于 bash
source ~/.zshrc # 适用于 zsh
① acme.sh
3.0版本之后默认的CA是ZeroSSL,首次使用需要进行注册。
acme.sh --register-account -m 这里写你的邮箱
② 或者也可以切换默认CA为Let's Encrypt。
acme.sh --set-default-ca --server letsencrypt
根据不同的DNS服务商有不同的环境变量配置要求,acme.sh 目前支持超过一百家的 DNS API,访问以下链接可以查看你的域名托管服务商的相关配置:
https://github.com/acmesh-official/acme.sh/wiki/dnsapi2
这里以腾讯云和华为云举两个例子:
腾讯云,需要依次执行以下命令
export Tencent_SecretId="<Your SecretId>"
export Tencent_SecretKey="<Your SecretKey>"
登录腾讯云控制台,进入访问管理
页面,进入访问密钥
菜单栏下的API密钥管理
可新建密钥,将对应的SecretId
和SecretKey
替换到上面命令中。
这里以example.com
为例生成SSL证书,这里生成的是泛域名证书,但必须同时有example.com
和*.example.com
。并且example.com
必须在前,否则你会发现即使签发成功了也没有任何文件输出。
./acme.sh --issue --dns dns_huaweicloud -d example.com -d *.example.com
生成SSL证书后在/root/.acme.sh/你的域名_ecc/目录下可以看到证书等文件。
将其中的证书、私钥复制到你Nginx配置证书的目录下,下面是复制命令示例:
cp fullchain.cer /docker/nginx/work/crt/
cp 域名.key /docker/nginx/work/crt/
Nginx中配置证书:
http {
# ... 这里省略...
server {
listen 443 ssl;
server_name 域名;
# ... 这里省略...
# SSL证书配置
ssl_certificate /work/crt/fullchain.cer;
ssl_certificate_key /work/crt/域名.key;
# ... 这里省略...
}
# ... 这里省略...
}
执行以下命令自动化部署证书:
acme.sh --install-cert -d "example.com" --ecc \
--cert-file /docker/nginx/work/crt/cert.pem \
--key-file /docker/nginx/work/crt/key.pem \
--fullchain-file /docker/nginx/work/crt/fullchain.pem \
--reloadcmd "docker restart nginx"
参数解释:
① /docker/nginx/work/crt/cert.pem
是部署后的域名证书地址。
② /docker/nginx/work/crt/key.pem
是部署后的私钥地址。
③ /docker/nginx/work/crt/fullchain.pem
是部署后的域名证书及中间证书地址。
cert.pem
和fullchain.pem
的区别是如果你的域名证书是某个中间CA签发的,而这个中间CA又是受信任的根 CA 签发或信任的,fullchain.pem
把这些拼接起来,让客户端可以一步搞定信任验证。
执行后如果提示:It seems that tworice.cn is an IDN( Internationalized Domain Names), please install 'idn' command first.
执行以下命令安装idn
即可:
apt install -y idn
通过acme.sh --install-cert命令执行了自动化部署后,acme.sh会通过之前安装的cron自动创建一个定时任务。
使用如下命令查看是否成功创建了定时任务:
crontab -l
正常结果显示应该是如下所示:
28 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
解释:
该定时任务会在每天凌晨的0时28分执行/root/.acme.sh/acme.sh --cron --home /root/.acme.sh
这个命令。
查看/root/.acme.sh/域名_ecc
文件夹下的域名.conf
文件,文件中可以看到Le_RealKeyPath和Le_RealFullChainPath等配置项,表示自动化续期证书时要把证书部署在哪个位置。
对应的就是在执行以下命令时,对应的key
和fullchain
文件:
acme.sh --install-cert -d example.com --ecc \
--key-file /docker/nginx/work/crt/example.com.key \
--fullchain-file /docker/nginx/work/crt/fullchain.cer \
--reloadcmd "docker restart nginx"
在前文中时的证书部署命令是将key
和fullchain
相关文件都部署为pem
文件,这里是key
和cer
文件,这个无所谓,效果是一样的。
acme.sh
会记忆最后一次执行证书部署命令时的参数信息。
免费证书是90天有效期,我们保证两个月更新一次证书即可,不需要每天一次这么频繁的判断证书是否有效。
把定时任务修改成每周二的凌晨三点检查一次即可。
① 修改定时任务:
crontab -e
② 选择编辑软件:
执行上面命令后会让你选择编辑软件,选择你常用的即可,我这里选择的是vim:
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]: 2
③ 修改定时任务为:
0 3 1 * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
vim
的基础用法,进入文件后输入i
进入编辑状态,编辑完之后按Esc
退出编辑状态,:
进入命令状态,在命令状态输入wq
保存修改。其他操作可以自行百度一下,这里不多描述了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。