——————

学习谭Sir,我今天也要成为一日两更的人,欧拉欧拉X2

——————

一、背景

来,开局一张图,康康咱的使用场景

使用场景

如图,咱在Docker和VM里都跑了有需要Docker的服务,具体如下

方式 需要HTTPS的服务 说明
Docker LuckyMail 邮箱
Docker 宝塔 可道云和两个音乐播放器
Docker VerySync 微力同步
VM LuckyBlogV2 V2版新博客

这4种,每种都在不同的ip下,环境相互隔离,都需要HTTPS服务,我使用的证书是Let’s Encrypt的,每周证书有申请次数限制,如果每个单独申请,次数是不够的,而且除了宝塔之外,都不能自动续签,如果手动每90天都去自己手动拷贝,实在是太麻烦了,也容易遗忘,所以我们来整个自动传递更新HTTPS证书呗~

二、上手

2.1思路

需求明了啦,我们就可以上手了,思路如下:

方案

2.2实践

2.2.1、宝塔证书到物理机

由于宝塔能够自动申请、续签证书,所以我们不太担心这个,这需要注意申请泛域名的就好,这样才能用到其它服务的网站上面

Docker宝塔到物理机我们选择使用docker cp命令,利用cron来定时跑,Unraid里面有User Script可以方便的执行Cron,非Unraid用户手动写cron命令即可

首先,用下面的命令查询容器ID

docker ps

然后根据容器id导出https的CA和key

#!/bin/bash
docker cp /容器id:/容器中https证书key的位置 /物理机存放https证书key的位置
docker cp /容器id:/容器中https证书CA的位置 /物理机存放https证书CA的位置

假如每天00:15执行,就在前面加上这个,更多cron语法,看这里

15 00 * * *

2.2.2 物理机证书到Docker

是2.2.1的反操作,调换容器和物理机的位置即可

#!/bin/bash
docker cp /物理机存放https证书key的位置 /容器id:/容器中https证书key的位置
docker cp /物理机存放https证书CA的位置 /容器id:/容器中https证书CA的位置

2.2.3 物理机证书到虚拟机

由于并不像物理机和Docker一样能直接传输文件,我们需要用点别的招数huaji

我们使用微力同步,来完成这一任务

共享物理机的证书文件夹,然后只读共享给虚拟机,在nginx里面指定https的位置,像下面这样

#如下示例,证书存放在/usr/local/plumemo/https下
#SSL-START
#error_page 404/404.html;
ssl_certificate /usr/local/plumemo/https/fullchain.pem; #换成你自己的https CA文件的位置
ssl_certificate_key /usr/local/plumemo/https/privkey.pem; #换成你自己的https key文件的位置
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END

这样就能指定更新证书啦

三、结语

综上,我们就把物理机、虚拟机、Docker之间的证书传递搞定啦,我们只需要申请一次证书,就可以在各个服务上使用,无需手动更新,妈妈再也不怕我HTTPS证书过期啦~