前言

Let's Encrypt是全球最大的数字证书认证机构(CA)之一, 也是目前唯一的一个由公益组织运营的机构, 她可以为网站提供免费的SSL/TLS证书. 然而申请的证书只有90天有效期, 到期后需要重新申请.

早在2018Let'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.confCERT_HOME='~/.acme.sh'的值为自定义文件夹.
!> 宝塔面板生成证书后存放的目录是"/www/server/panel/vhost/cert"

acme.sh生成证书需要验证域名所有权, 有两种方式: HTTP验证及DNS验证.
此处使用DNS验证, 该方式能通过域名解析商提供的API自动添加txt记录完成验证.
CloudFlare为例:

  1. 登录CloudFlare账号, 再点此获取API key
  2. 在终端执行下面两个命令, 设置环境变量
export CF_Key="你的 CloudFlare API Key"
export CF_Email="你的邮箱"

第一行CF_Key填写在步骤1里获取的 API Key
第二行CF_Email填写自己注册CloudFlare用的邮箱

注意: 不同的域名解析商, 导入的参数是不一样的, 文末附其他常见DNS API设置

  1. 申请泛域名证书
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设置.

Last modification:October 10th, 2019 at 12:51 am
如果觉得我的文章对你有用,请随意赞赏