elev

1Introduction

Let’s Encrypt 是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程, 并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。

-- 维基百科

elev 是基于开源模块而进行封装的 nodejs 命令行工具,主要实现 Let’s Encrypt 的 泛域名 DNS 记录验证方式(目前仅支持阿里云 DNS 服务商)的 SSL 证书的签发和自动续期。

2Install

npm install elev --global

3elev

➜  ~ elev

  `7MM"""YMM  `7MMF'      `7MM"""YMM  `7MMF'   `7MF'
    MM    `7    MM          MM    `7    `MA     ,V
    MM   d      MM          MM   d       VM:   ,V
    MMmmMM      MM          MMmmMM        MM.  M'
    MM   Y  ,   MM      ,   MM   Y  ,     `MM A'
    MM     ,M   MM     ,M   MM     ,M      :MM;
  .JMMmmmmMMM .JMMmmmmMMM .JMMmmmmMMM       VF

  Usages:
  elev domain                     列出当前已配置的域名
  elev domain <domain>            新建或编辑域名配置文件
  elev domain <domain> -r <reference>
                                  参考指定域名进行新建或编辑配置文件
  elev worker <ID>                查看指定 ID 的工作记录

  Commands:
  domain                          域名配置相关
  visa                            签发一张 Let’s Encrypt 泛域名证书
  cron                            定时任务相关
  schedule                        定时计划相关
  worker                          定时任务工作
  smtp                            SMTP 相关
  version                         输出版本号并检查更新

  Options:
  --version, -v, -V               print version information
  --help, -h, -H                  print help information

4Usages

4.1添加一个域名

➜  ~ elev domain example.com

  `7MM"""YMM  `7MMF'      `7MM"""YMM  `7MMF'   `7MF'
    MM    `7    MM          MM    `7    `MA     ,V
    MM   d      MM          MM   d       VM:   ,V
    MMmmMM      MM          MMmmMM        MM.  M'
    MM   Y  ,   MM      ,   MM   Y  ,     `MM A'
    MM     ,M   MM     ,M   MM     ,M      :MM;
  .JMMmmmmMMM .JMMmmmmMMM .JMMmmmmMMM       VF

2018-08-29 16:54:06.956 当前域名 example.com
2018-08-29 16:54:06.959 /~/.elev/domains/example.com.ini
2018-08-29 16:54:06.961 即将进入编辑模式

这时候会弹出配置文件编辑模式:

; =================================
; 域名配置文件
; =================================

[ base ]
domain                  = example.com
emailAddress            =
dnsRefreshSeconds       = 120
dnsServerName           = aliyun
dnsServerAccessKey      =
dnsServerAccessSecret   =
certificateKeyFileName  = example.com.key
certificateCertFileName = example.com.pem
saveDirname             = /etc/nginx/cert.d
afterSaveCommand        = nginx -t && nginx -s reload


[ smtp ]
from                    = elev 命令执行报告<someone@example.com>
to                      = 姓名1<anyone1@example.com>, 姓名2<anyone2@example.com>
subject                 = elev 命令执行报告
host                    =
port                    = 465
secure                  = true
user                    =
pass                    =

修改相关配置保存即可。配置文件分成两个部分:

4.1.1base 部分

  • domain:域名
  • emailAddress:邮件地址,证书签发需要邮箱账户(Let's Encrypt 官方要求)
  • dnsRefreshSeconds:DNS 刷新时间,证书签发等待刷新时间
  • dnsServerName:DNS 服务器名称,目前仅支持aliyun
  • dnsServerAccessKey:DNS 访问 KEY
  • dnsServerAccessSecret:DNS 访问密钥
  • certificateKeyFileName:证书文件名
  • certificateCertFileName:证书文件名
  • saveDirname:证书保存目录
  • afterSaveCommand:证书保存后执行的命令,如果需要 root 权限,请以 root 权限执行 elev

4.1.2smtp 部分

证书签发结果会使用 smtp 进行邮件发送。

  • from:邮件来源
  • to:邮件接收方,可以多个
  • subject:邮件主题
  • host:smtp 域名
  • port:smtp 端口
  • secure:是否采用安全协议
  • user:smtp 用户名
  • pass:smtp 密码

4.2验证 smtp

为了验证这个邮件发送的有效性,可以验证下:

➜  ~ elev smtp -d example.com

  `7MM"""YMM  `7MMF'      `7MM"""YMM  `7MMF'   `7MF'
    MM    `7    MM          MM    `7    `MA     ,V
    MM   d      MM          MM   d       VM:   ,V
    MMmmMM      MM          MMmmMM        MM.  M'
    MM   Y  ,   MM      ,   MM   Y  ,     `MM A'
    MM     ,M   MM     ,M   MM     ,M      :MM;
  .JMMmmmmMMM .JMMmmmmMMM .JMMmmmmMMM       VF

2018-08-29 16:57:35.492 测试 smtp 邮件发送是否异常
2018-08-29 16:57:35.493 正在使用 阿里云企业邮箱 发送邮件
2018-08-29 16:57:35.930 测试邮件发送成功
2018-08-29 16:57:35.930 收件人 xxx@yyy.com

4.3泛域名签证

因为签证结束要执行相关命令(afterSaveCommand 通常是重启 nginx), 这时候需要命令执行的权限能够执行该命令,必要的时候需要添加 sudo 或者 root 权限下执行。

➜  ~ elev visa -d example.com

  `7MM"""YMM  `7MMF'      `7MM"""YMM  `7MMF'   `7MF'
    MM    `7    MM          MM    `7    `MA     ,V
    MM   d      MM          MM   d       VM:   ,V
    MMmmMM      MM          MMmmMM        MM.  M'
    MM   Y  ,   MM      ,   MM   Y  ,     `MM A'
    MM     ,M   MM     ,M   MM     ,M      :MM;
  .JMMmmmmMMM .JMMmmmmMMM .JMMmmmmMMM       VF

2018-08-29 17:07:14.443 --------------------------
2018-08-29 17:07:14.444 Let’s Encrypt 证书签发开始
2018-08-29 17:07:14.444 调试模式 false
2018-08-29 17:07:14.444 签发域名 example.com
2018-08-29 17:07:14.445 开始读取配置文件
2018-08-29 17:07:14.453 创建私钥
2018-08-29 17:07:16.356 创建 Let’s Encrypt 账户
2018-08-29 17:07:17.687 创建 Let’s Encrypt 订单
2018-08-29 17:07:18.220 处理 Let’s Encrypt 订单
2018-08-29 17:07:18.508 需要验证 2 次
2018-08-29 17:07:18.511 第 1 次验证
2018-08-29 17:07:18.514 选择验证方式 dns-01
2018-08-29 17:07:18.516 应用验证方式
2018-08-29 17:07:18.516 验证查询地址 https://acme-v02.api.letsencrypt.org/acme/challenge/...
2018-08-29 17:07:18.520 添加 TXT 记录 wQjan6T4opcjbYSNaEUPpoF6pM2EIro5yOzRodmyq-o
2018-08-29 17:09:19.351 提交验证结果
2018-08-29 17:09:19.884 等待验证状态
2018-08-29 17:09:25.418 验证成功
2018-08-29 17:09:25.421 删除 TXT 记录
2018-08-29 17:09:25.944 第 2 次验证
2018-08-29 17:09:25.947 选择验证方式 dns-01
2018-08-29 17:09:25.948 应用验证方式
2018-08-29 17:09:25.950 验证查询地址 https://acme-v02.api.letsencrypt.org/acme/challenge/...
2018-08-29 17:09:25.955 添加 TXT 记录 KKGbscW5rXQ8ZCwRI3mBzNcWVwf36M3hMuYdxN8PxqM
2018-08-29 17:11:26.787 提交验证结果
2018-08-29 17:11:27.397 等待验证状态
2018-08-29 17:11:32.922 验证成功
2018-08-29 17:11:32.924 删除 TXT 记录
2018-08-29 17:11:33.326 创建 csr
2018-08-29 17:11:36.253 完成 Let’s Encrypt 订单
2018-08-29 17:11:38.192 获取 Let’s Encrypt 证书
2018-08-29 17:11:38.680 /etc/nginx/cert.d/beidoucheche.com.key
2018-08-29 17:11:38.689 文件保存成功
2018-08-29 17:11:38.689 /etc/nginx/cert.d/beidoucheche.com.pem
2018-08-29 17:11:38.690 文件保存成功
2018-08-29 17:11:38.691 nginx -t && nginx -s reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
2018-08-29 17:11:38.789 命令执行成功
2018-08-29 17:11:38.790 Let’s Encrypt 证书签发结束
2018-08-29 17:11:38.790 --------------------------

4.4添加定时任务

➜  ~ elev cron start

  `7MM"""YMM  `7MMF'      `7MM"""YMM  `7MMF'   `7MF'
    MM    `7    MM          MM    `7    `MA     ,V
    MM   d      MM          MM   d       VM:   ,V
    MMmmMM      MM          MMmmMM        MM.  M'
    MM   Y  ,   MM      ,   MM   Y  ,     `MM A'
    MM     ,M   MM     ,M   MM     ,M      :MM;
  .JMMmmmmMMM .JMMmmmmMMM .JMMmmmmMMM       VF

2018-08-29 17:14:58.532 正在检查定时任务计划表达式
2018-08-29 17:14:58.534 正在启动定时任务
2018-08-29 17:14:58.537 daemon pid 37286
2018-08-29 17:14:58.539 定时任务启动成功
2018-08-29 17:14:58.540 启动周期 每月 1 日凌晨 4 点
2018-08-29 17:14:58.540 start at 2018-08-29 17:14:58.537

至此一个完成的域名签发、续期操作完成。

4.5添加更多域名

如果要添加新域名,仅参考已配置好的域名进行添加域名:

➜  ~ elev domain new-domain.com -r example.com

添加的新域名会被下一次定时任务自动收集。

5Dependencies

6Reference