IT之家学院:Let's Encrypt证书一处申请多服务器同步教程

2019-01-20 14:36IT之家特约 - xubiaosunnny
感谢IT之家网友 xubiaosunnny 的线索投递!

我自己域名的SSL证书都是使用的Let's Encrypt,不但免费而且使用Certbot申请也特别方便快速。之前都是申请单域名的证书,在每个需要的服务器上分别单独申请。

开始需要证书的服务少还好,后来越来越多了,自己的一个小网站、NextCloud服务器、OpenVPN、家里的路由器后台、OpenMediaVault等,这样的话在每个机器上都得申请一次,太繁琐。而Let's Encrypt支持泛域名申请,那么我们就可以在一台服务器上申请然后同步到其他服务器上。

于是我抽空这两天简单做了一个Let's Encrypt证书自动续租及其他服务器自动同步的程序。服务运行模式为客户端-服务器模式,代码使用Python3开发。

>>GitHub项目地址<<

整套服务的两种工作模式:

  • 主动式(相对于客户端而言):该模式就是客户端自动请求服务端,如果发现证书已经变动则下载证书。可以将客户端脚本加入crontab,让脚本定时检查服务端证书的变化,并获取。这种方式相对于订阅模式缺乏实时性,但也影响不大,Let's Encrypt证书续租一次三个月有效期,而只能提前30天续租,只要客户端更新及时,不会逾期也,可以定时任务设置为每天运行。

  • 订阅模式:该模式讲究实时性,只要服务端续租成功将马上将证书同步到已经订阅服务的客户端服务器上。客户端订阅的时候会将服务端的SSH公钥注入到本地,已方便服务端免密码同步证书文件。服务端免密同步使用Rsync。客户端也需要加入Crontab来不断订阅,因为订阅的有效期为60天。

具体教程如下:

certbot-async

该项目是一个Let's Encrypt证书续租及服务器间同步程序,目的是为泛域名证书在一台服务器上申请,其他需要证书的服务器自动同步。

服务端

在启动服务端程序之前,首先要使用Certbot(地址:https://certbot.eff.org/)成功申请证书。

参考以下链接及官方文档:https://www.hi-linux.com/posts/6968.html

将项目克隆到/root/certbot-asnyc,如在其他位置需自行修改命令参数

该服务须以管理员权限运行,因为Let's Encrypt目录的用户为root。如果root用户没有生成过ssh key,还需先使用ssh-keygen生成公钥。

在项目下创建server_config.json来配置相关设置,可选配置参数:

{
    "domain": "xxx.xx", //申请证书的域名,如xubiaosunny.online
    "certbot_path": "", // certbot-auto文件位置,建议将其放入/usr/bin下
    "renew_period": 10, //续租周期,默认10天尝试续租一次
    "port": 8000, //服务监听端口
    "access_key": "", //认证key
    //配置邮箱以便通知续租情况,可不配置
    "smtp_server": "", //邮箱服务器地址
    "smtp_port": "", //邮箱服务器端口
    "smtp_ssl": true, //是否启用SSL
    "smtp_email": "", //邮箱地址
    "smtp_password": "", //邮箱密码
    "notify_receiver": "" //接收通知的邮箱
}

在项目下创建whitelist.txt以启用在白名单功能,将允许访问的ip一行一个写入文件内。删除该文件则所有ip均可访问。

服务端启动可选参数:

-r, --renew 直接续租,不启动服务
-s, --ssl  使用https启动服务,默认使用http

Docker启动

1、首先安装docker

sudo apt-get update
sudo apt-get install docker-ce

2、构建镜像

docker build --rm -f "Dockerfile" -t certbot-async:latest .

3、启动容器

docker run -d -it \
-v /root/certbot-async:/root/certbot-asnyc \
-v /etc/letsEncrypt:/etc/letsEncrypt \
-v /root/.ssh:/root/.ssh \
-p 8000:8000 \
--rm --name certboot-async certbot-async python ./server.py

使用python3直接启动

1、安装pipenv

python3 -m pip install pipenv

2、安装依赖

pipenv install

3、启动服务程序

pipenv run python ./server.py

客户端

在项目下创建client_config.json来配置相关设置,可选配置参数

{  
    "server_host": "http://127.0.0.1:8000", //服务端地址
    "access_key": "", //认证key,需与服务端一样
    "cert_dir": "./letsEncrypt", //证书存放位置
    "after_script": "echo $HOME", //获取证书后执行的命令
    "ssh_port": "22" //本地ssh端口
}

客户端有两种工作模式:

主动模式

直接从服务端下载证书文件

pipenv run python ./client.py

订阅模式

pipenv run python ./client.py -rs

订阅后,服务端续租成功后会自动将证书同步到客户端服务器,讲求实时性。订阅有效期为60天。须在60天内再次订阅,逾期服务端将不会同步。

IT之家注:该文章由IT之家编辑整理,作者原博客地址

广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本声明。

文章价值:
人打分
有价值还可以无价值
置顶评论
    热门评论
      文章发布时间太久,仅显示热门评论
      全部评论
      一大波评论正在路上
        取消发送
        软媒旗下人气应用

        如点击保存海报无效,请长按图片进行保存分享