背景
目前国内主流的免费证书都已经改为3个月有效期,而且基本都不支持泛域名证书,像我这样有多个二级域名的博主,每3个月就要重新申请替换一遍,真是想想就麻烦,调研了下发现有很多成熟的软件能够实现免费且全自动的证书申请,甚至证书自动续期。
acme.sh 是一个开源的,实现 ACME 客户端协议的纯 Unix shell 脚本,提供颁发、安装和自动更新证书、邮件通知等功能。 随着作者不断更新,未来将支持更多 CA,目前已经支持 CA 如下:
安装
curl https://get.acme.sh | sh
source ~/.bashrc
查看版本
申请证书
目前 acme.sh 支持 5 个正式环境 CA,分别是 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL。
我一开始使用的就是默认的ZeroSSL,但最后一直卡在Order status is 'processing', let's sleep and retry
所以我这里切换到了Let’s Encrypt
acme.sh --set-default-ca --server letsencrypt
官方提供的域名所有权认证方式有两种:
- HTTP 模式,需要在你的网站根目录下放置一个文件, 来验证你的域名所有权。
- DNS 模式,手动或使用 DNS 解析服务商提供的 api 添加 txt 解析记录验证域名所有权。
泛域名证书的解析目前仅支持 DNS 方式验证,我这里使用 DNS API 模式来验证域名所有权
DNS API 模式(推荐,支持泛域名)
这种方式会使用域名服务商提供的 api 自动为你的域名添加一条 txt 解析,验证成功后, 这条解析记录会被删除,大概需要等待 1、2 分钟 等待 DNS 解析。
进入腾讯云,点击创建密钥,生成一个随机的 ID
、Token
将获取到的密钥配置到环境变量
# 腾讯云是DP_Id和DP_Key,如果是阿里则分别为Ali_Key和Ali_Secret
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
执行如下命令开始申请
其中 dns_dp 是指腾讯的DNSPOD,如果你的域名托管在阿里就要改成dns_ali
*.guitang.fun 换成你的泛域名即可
一定要设置两个域名,一个是*.域名,另外一个是域名,按照代码命令设置,切记!
acme.sh --dns dns_dp --issue -d *.guitang.fun -d guitang.fun
安装证书
生成的证书默认都放在安装目录下: ~/.acme.sh
, 请不要直接使用此目录下的证书文件, 它们仅供内部使用,文件夹结构将来可能会更改。 例如: 不要直接在 nginx 的配置文件引用这个目录的证书文件
acme.sh --install-cert -d *.guitang.fun \
--key-file /home/soc/blog/conf.d/guitang.fun_acme/*.guitang.fun.key \
--fullchain-file /home/soc/blog/conf.d/guitang.fun_acme/fullchain.pem \
--reloadcmd "docker restart nginx"
把“*.guitang.fun”替换成刚刚您自己申请的泛域名,再把“*.guitang.fun.key”换成刚刚生成的SSL证书密钥文件,fullchain.cer不需要替换了,默认生成的就是这个。
进目录看下文件是否正确拷贝过去了
配置服务器
然后就是把你使用证书的地方配置一下,我这里是nginx
刷新网站,验证效果
安装七牛云证书
博客的图片是托管在七牛云上的,acme.sh也提供了支持,参考官网文档部署
export QINIU_AK="PXjgvwDJ***"
export QINIU_SK="PN9Ujc***"
# 泛域名的话要加这个配置,官网上说要有. 但我实际部署的时候没加
export QINIU_CDN_DOMAIN="cdn.guitang.fun"
acme.sh --deploy -d *.guitang.fun --deploy-hook qiniu
最后虽然报错了,但去七牛云-证书管理页面,发现证书已经传上去了
点击部署按钮
浏览器刷新图片,发现已经ok了
发表回复