文章目录
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
等。
1. 下载acme.sh
① 命令方式下载:
最方便的方式是使用以下命令安装
curl https://get.acme.sh | sh
但该方式使用的源是Github
,没有科学上网可能会导致无法下载,可以通过访问国内的Gitee
下载。
② 国内源Gitee手动下载:
Gitee地址:https://gitee.com/neilpang/acme.sh
使用Git克隆仓库文件到本地,或直接下载zip到本地后上传到你的服务器,反正最终的效果就是你要把这个仓库里的每一个文件都要弄到你的服务器中去。
2. 安装cron和socat
这两个应用是acme.sh
依赖的,如果没有的话安装acme.sh
时会警告。
apt update && apt install cron -y && apt install socat -y
3. 安装acme.sh
进入下载下来的acme.sh
文件夹根目录执行以下命令:
./acme.sh --install
4. 重新加载环境变量
重新加载环境变量(或重新登录),不重新加载的话无法使用acme.sh
命令。
下面的命令只需要执行其一即可,根据自己的情况:
source ~/.bashrc # 适用于 bash
source ~/.zshrc # 适用于 zsh
5. 注册ZeroSSL或切换默认CA为Let’s Encrypt
① acme.sh
3.0版本之后默认的CA是ZeroSSL,首次使用需要进行注册。
acme.sh --register-account -m 这里写你的邮箱
② 或者也可以切换默认CA为Let’s Encrypt。
acme.sh --set-default-ca --server letsencrypt
6. 设置DNS API配置到环境变量
根据不同的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
替换到上面命令中。
② 华为云,需要依次执行以下命令
这里以华为云为例,依次执行以下命令添加临时环境变量:
export HUAWEICLOUD_Username="<Your IAM Username>"
export HUAWEICLOUD_Password="<Your Password>"
export HUAWEICLOUD_DomainName="<Your DomainName>"
HUAWEICLOUD_Username是你的账户名称,如果是子账号则填写子账号。
HUAWEICLOUD_Password是账号的登录密码,可以尝试去华为云官网登录一下。
HUAWEICLOUD_DomainName也是账号名称。
可通过华为云提供的参数说明文档找到这些参数:https://support.huaweicloud.com/api-iam/iam_01_0006.html
7. 生成SSL证书
这里以example.com
为例生成SSL证书,这里生成的是泛域名证书,但必须同时有example.com
和*.example.com
。并且example.com
必须在前,否则你会发现即使签发成功了也没有任何文件输出。
./acme.sh --issue --dns dns_huaweicloud -d example.com -d *.example.com
8. 手动配置证书
生成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;
# ... 这里省略...
}
# ... 这里省略...
}
9. 自动化部署证书
执行以下命令自动化部署证书:
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
10. 自动化续期证书
这个放在下一期文章讲,文章太长了,不利于阅读。