情境分享,设想您有WebHosting,他只提供FTP连线,然后您想手动的方式申请证书。
在本篇分享我如何使用Docker安装curlftpfs,并且挂载远程主机FTP数据夹,
然后在容器内运行certbot申请SSL证书。
撇除证书申请不说,我初次发觉到curlftpfs这个命令时,觉的满有意思的,特别是如果你是MacOS用户,
手边没有一个满意的FTP软体时。您跟我一样喜欢在命令行上打滚,或许您应该也会喜欢这个命令。🤭
首先,我们建就从创建Dockerfile开始吧。
Yaml档如下,我习惯中文环境的终端机。
From ubuntu:latest
RUN apt-get update && apt-get install -y \
locales curlftpfs python3 certbot vim
#中文环境
RUN echo "Asia/Taipei" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata && \
sed -i -e 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/' /etc/locale.gen && \
echo 'LANG="zh_TW.UTF-8"'>/etc/default/locale && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=zh_TW.UTF-8
ENV LANG zh_TW.UTF-8
ENV LANGUAGE zh_TW.UTF-8
ENV LC_ALL zh_TW.UTF-8
我们就来用这个Dockerfile建一个ftpbot的image吧,命令如下:
请将Dockerfile放到一个空目录下再build,必免不必要的快取问题 。
docker build -t ftpbot .
完成了image的创建,我在自己的数据夹再建一个letsencrypt的目录,所以我可以用下方的命令创建容器,并且进入容器内
等等在容器中要使用curlftpfs,在容器启动时,必需有--privileged。
docker run --rm --privileged -v $(pwd)/letsencrypt:/etc/letsencrypt -ti ftpbot bash
接下来,在容器中挂载远程主机的数据夹到容器的/mnt目录
curlftpfs FTP帐号:FTP密码@FTP主机 /mnt
运行certbot命令,依指示操作
certbot certonly --manual --email 申请的邮件 --agree-tos \
-d 域名.com \
-d www.域名.com
在上面的画面中画面会停住等待Enter,他要我们去网站创建验证档LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
这时,我们可以有两种处理方式
一、Ctrl+z暂时让进程先放到背景,然后切到/mnt挂载的网页FTP目录中去生成acme验证档 ,完成后再打fg回前景。
二、开另一个终端机进入运行中的容器去操作,我的习惯我用这个 方式。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:
LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4._ZtWqdsZpgLv_TS7hHMCm0zcL8HXhJrGePNrNSSi23Y
And make it available on your web server at this URL:
http://域名.com/.well-known/acme-challenge/LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
例如,我们在容器中,打hostname,比较好拷贝
root@07291c69af42:~# hostname
07291c69af42
root@07291c69af42:~#
然后在自己的Host端,就可以下命令进入同一个运行中的容器
docker exec -ti 07291c69af42 bash
root@07291c69af42:/#
举例,远程网站的根目录是/www,所以我们可以下如下的命令创建.well-knon/acme-challenge目录。
用FTP挂载的情况下,建议操作方式先touch再echo,大概如下的操作
root@07291c69af42:~# cd /mnt/
root@07291c69af42:/mnt# mkdir -p www/.well-knon/acme-challenge
root@07291c69af42:/mnt# cd www/.well-knon/acme-challenge
root@07291c69af42:/mnt/www/.well-knon/acme-challenge# touch LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
#这里echo 内容后,有个 > 重导哦
root@07291c69af42:/mnt/www/.well-knon/acme-challenge# echo LW_70m1q1QWIAtnR8rU--略---GePNrNSSi23Y > LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
root@07291c69af42:/mnt/www/.well-knon/acme-challenge#
完成后,确认网址是开的出这个档的,再压Enter,完成ACME的验证。
http://域名.com/.well-known/acme-challenge/LW_70m1q1QWIAtnR8rU3QK4znLP9iyvp1Uf3mBsU4
都搞定后,就可以umount离开了,然后证书会在挂在的目录下(底下是示意图)
cd letsencrypt/live/域名.com
以上是手动的方式,但要做到自动申请证书及RENEW也是可以的。不过篇幅有限,有机会我再介绍。
直接让certbot把证书档存到/mnt的目录上行吗,答案是「不行」,这种情况certbot没法直接写挂到挂载的远程主机数据夹。
提示,我们可以让certbot把验证档生成在容器内的本地数据夹,再用一支Python的watchdog文件变动进程,发现文件新建了,就运行拷贝
把文件搬到/mnt上的验证目录,我的经验证行,而且一次搞定六个网站的证书申请。
至於renew的部份,我们都有letsencrypt的数据夹在host端了,弄个crontab的调度让他每天去跑应该就OK啦。
所以到此您应该发觉为何我的image名称要叫ftpbot了,因为最终我是要让他自重化运行,
不是手动运行的,所以image名称我真的没取错,嘻嘻。
No Comment
Post your comment