前言
Let's Encrypt
是全球最大的数字证书认证机构(CA
)之一, 也是目前唯一的一个由公益组织运营的机构, 她可以为网站提供免费的SSL/TLS
证书. 然而申请的证书只有90
天有效期, 到期后需要重新申请.
早在2018
年Let's Encrypt
就宣布其SSL
证书支持泛域名了, 其实一直想写这么一篇关于如何申请Let’s Encrypt
泛域名证书的教程, 然而鸽了好久都没动静.
趁着先前申请的证书过期之际, 便打算使用acme.sh
来为博客申请Let's Encrypt
泛域名证书, acme.sh
可能是众多申请工具中最简单、最智能的, 以后再也不用担心证书会过期了. 现把申请过程整理出来, 以供读者参考.
什么是泛域名证书
泛域名证书又叫通配符证书, 俗称野卡, 类似*.yindan.me
这样的域名证书. 这些证书可以保护一个域名下的所有子域名, 简直不要太便利!
什么是 acme.sh
acme.sh
是一个开源的ACME
(自动化证书管理环境) 脚本, 可以很方便地从Let's Encrypt
生成免费证书, 并实现自动续期.
- 项目主页
申请步骤
安装依赖
# CentOS/Redhat
yum install curl cron socat -y
# Ubuntu/Debian
apt-get install curl cron socat -y
安装 acme.sh
curl https://get.acme.sh | sh
安装成功后, 会在当前目录下生成一个.acme.sh
文件夹
生成证书
默认生成的证书都放在安装目录~/.acme.sh/
下, 一般不用修改, 如需修改的可在生成之前编辑~/.acme.sh/account.conf
里CERT_HOME='~/.acme.sh'
的值为自定义文件夹.
!> 宝塔面板生成证书后存放的目录是"/www/server/panel/vhost/cert"
acme.sh
生成证书需要验证域名所有权, 有两种方式: HTTP
验证及DNS
验证.
此处使用DNS
验证, 该方式能通过域名解析商提供的API
自动添加txt
记录完成验证.
以CloudFlare
为例:
- 登录
CloudFlare
账号, 再点此获取API key
- 在终端执行下面两个命令, 设置环境变量
export CF_Key="你的 CloudFlare API Key"
export CF_Email="你的邮箱"
第一行CF_Key
填写在步骤1
里获取的 API Key
第二行CF_Email
填写自己注册CloudFlare
用的邮箱
- 申请泛域名证书
acme.sh --issue --dns dns_cf -d yindan.me -d *.yindan.me
记得替换成自己的域名.
顺利的话, 接下来证书就会自动签发, 并且步骤2
中的信息也会保存在~/.acme.sh/account.conf
文件中供后续使用, 当申请约有60
天时自动更新证书, 无需人工干预.
复制证书
acme.sh
官方文档不推荐直接使用默认安装目录下的文件, 因为这里面的文件都是供其内部使用的, 而且随着更新该目录结构可能会变化. 故应用下列命令将证书复制到自定义文件夹:
acme.sh --installcert -d yindan.me -d *.yindan.me \
--key-file /www/server/panel/vhost/ssl/yindan.me/privkey.pem \
--fullchain-file /www/server/panel/vhost/ssl/yindan.me/fullchain.pem \
--reloadcmd "service nginx force-reload"
其他操作
- 设置自动升级 acme.sh
因acme.sh
经常更新, 故推荐打开自动升级功能以保持最新版本.
# 自动升级
acme.sh --upgrade --auto-upgrade
# 关闭自动升级
acme.sh --upgrade --auto-upgrade 0
# 手动升级
acme.sh --upgrade
# 卸载
acme.sh --uninstall
- 自动续签状态
查看crontab
任务: 执行crontab -l
命令, 如果在输出信息中找到
类似55 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh"
的任务就说明自动续签设置成功.
- 强制更新证书
证书未到期时强制更新:
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
部署教程
宝塔面板部署教程可查看该文章
至此, 就可以愉快地把续签任务交给acme.sh
, 麻麻再也不用担心我的证书失效啦!
附录:常用 DNS API 设置
阿里云
# 设置变量
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
# 申请证书
acme.sh --issue --dns dns_ali -d example.com -d www.example.com
腾讯云/DNSPod(国内版)
#设置变量
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
#申请证书
acme.sh --issue --dns dns_dp -d example.com -d www.example.com
CloudXNS
# 设置变量
export CX_Key="1234"
export CX_Secret="sADDsdasdgdsf"
# 申请证书
acme.sh --issue --dns dns_cx -d example.com -d www.example
GoDaddy
# 设置变量
export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
# 申请证书
acme.sh --issue --dns dns_gd -d example.com -d www.example
Amazon Route53
# 设置变量
export AWS_ACCESS_KEY_ID=XXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXX
# 申请证书
acme.sh --issue --dns dns_aws -d example.com -d www.example.com
这里只列举了部分常用的域名解析商API
获取方式, 此外诸如linode、he、digitalocean、namesilo、namecom、freedns、yandex之类也是支持的, 点击此处查看更多DNS API设置.
One comment
[...]本文参考了前人的尝试: https://www.yindan.me/website/7.html https://www.yindan.me/website/8.html[...]