SSL 证书自动化更新 / 部署

Backgrounds

OHTTPS Dachboard | OHTTPS 文档

腾讯云附赠的一年 SSL 证书到期了,再续便是 90 天有效期,十分麻烦。偶然得知 OHTTPS 服务可支持主流云服务商及多种平台 SSL 免费证书的自动化申请 / 更新及部署,一探究竟,记之此文。

笔者去年主要给四个三级域名申请了证书 ( 因为腾讯云不给泛解析证书 ),其中三个位于自己的轻量服务器,一个绑定七牛云 CDN.

Solutions

注册账号后申请了 Let’s Encrypt 的泛解析证书,向 DNS 解析添加一条 CNAME 便完成。

参考 OHTTPS 教程 进行自动化证书更新 / 部署,更新周期设为最长 75 天。七牛云节点容易配置,服务器节点则稍费工夫,通过创建 SSH 节点完成。

SSH 节点部署

前置

建议创建专门用于证书部署的用户。

1
2
3
4
# 新建cert用户
useradd -m cert
# 设置cert用户登录密码
passwd cert

权限控制

1
sudo sudoer

进入 NANO 后在文件末尾添加

1
cert ALL=(ALL:ALL) NOPASSWD: ALL

最后一个 ALL 代表赋予 cert 使用 sudo 执行全部命令,且不需要输入密码的权限。现在 cert 与轻量服务器默认用户名 ubuntu 具有相同权限。

NGINX 配置说明

执行 nginx -t 查找配置文件。笔者之前的 nginx.conf 配置中,与证书自动部署相关的内容为

1
2
ssl_certificate /path/to/myurl_bundle.cer;
ssl_certificate_key /path/to/myurl.key;

之前使用的是 .crt 格式,改成 Let’s Encrypt 提供的 .cer 后缀。由于之前为每个域名配置单域名证书,SSL 配置也写了三份,本着增量修改的原则,这里不修改 nginx.conf,而是将自动部署到服务器的证书拷贝三份到各自目录。

OHTTPS

采用 SSH 方式进行节点部署时,OHTTPS 会按顺序远程执行前置命令、证书文件创建或更新命令、后置命令。

笔者将前置 / 后置动作分别写入 pre-run / post-run 脚本,并由前置命令和后置命令远程执行。见附录。

中间命令

中间命令由 OHTTPS 自动配置执行,在当前文件夹下创建一个证书文件夹,文件夹的名称为证书 ID,文件夹内有两个文件:私钥文件 cert.key(PEM格式)、证书文件 fullchain.cer(PEM格式),当证书文件夹或证书文件已经存在时,不会进行重复创建,只会对证书内容进行更新。

1
2
3
4
# 此处仅展示该命令基本逻辑
mkdir -p ./${certificateName}
echo "${certificateCertKey}" > ./${certificateName}/cert.key
echo "${certificateFullchainCerts}" > ./${certificateName}/fullchain.cer

权限问题

在此记录笔者遇到的权限问题。首先,用户目录 cert 创建后为只读,包括对 cert 自己,这应该属于基本功,也是提醒自己 Linux 水平该补课了。一种粗糙的解决方案是将 cert 的所有工作目录全部提权为 777,cert 也给自己创建的目录及时提权便于后续的拷贝等动作。这部分逻辑在脚本中实现。

再便是报一些 BadInterrupter 问题,如 ^M 等,是在 Windows 下编辑文件导致。不做赘述。

历经失败 5 次后部署成功。执行以下命令验证证书过期时间

1
openssl x509 -in /path/to/fullchain.cer -[enddate|text] -noout

注意给 OHTTPS 服务器地址加白。

FAQs

别名证书

以 Gitlab 为例,别名后是 Gitlab 给申请证书。不过 CNAME 并不一定要证书,如果完全重定向过去,用的就是对方的 SSL 证书。

References

  1. OHTTPS Docs
  2. 小叶的博客
  3. 「免费」玩转 HTTPS、SSL 证书,一键申请、更新续期、部署

附录

pre-cmds

1
2
3
4
WORKING_DIR=/home/cert/ohttps
cd $WORKING_DIR
./pre-run.sh
cd ./ci/

post-cmds

1
2
cd ..  # back to $WORKING_DIR
./post-run.sh

pre-run.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

BASE_SSL_PTH=/usr/local/ssl
BASE_NGINX_PTH=/www/server/panel/vhost/nginx

HEXON_PTH=$BASE_SSL_PTH/hexon
PICBED_PTH=$BASE_SSL_PTH/picbed
WP_PTH=$BASE_SSL_PTH/wp

sudo rm -rf $HEXON_PTH/*
sudo rm -rf $PICBED_PTH/*
sudo rm -rf $WP_PTH/*

WORKING_DIR=/home/cert/ohttps
cd $WORKING_DIR
sudo rm -rf ./ci/*

post-run.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# definations

sudo chmod 777 ./ci/*

sudo cp -r ./ci/*/fullchain.cer $HEXON_PTH/hexon.miyamura.top_bundle.cer
sudo cp -r ./ci/*/cert.key $HEXON_PTH/hexon.miyamura.top.key

sudo cp -r ./ci/*/fullchain.cer $PICBED_PTH/picbed.miyamura.top_bundle.cer
sudo cp -r ./ci/*/cert.key $PICBED_PTH/picbed.miyamura.top.key

sudo cp -r ./ci/*/fullchain.cer $WP_PTH/wp.miyamura.top_bundle.cer
sudo cp -r ./ci/*/cert.key $WP_PTH/wp.miyamura.top.key

sudo nginx -s reload