by Devin Yang

建立于: 1年前 ( 更新: 1年前 )

情境分享,设想您有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名称我真的没取错,嘻嘻。

Tags: certbot docker ftp

Devin Yang

文章内容无法一一说明,如果您有什么不了解处,欢印提问哦:)

No Comment

Post your comment

需要登入才可留言!

类似文章


docker

Docker image的封存及取回

如何封存docker的image成为tar档,并且载回docker image。 我们可以用docker save及docker load进行。

laravel docker

关於D-Laravel的项目模式

如果您是新使用者,建议您改用我的最新环境phpenv。https://github.com/DevinY/phpenv

docker

Devin Yang的Docker初学笔记

这是我初学Docker时的笔记,有点粗糙,有调整了一下下。 但我想对於Docker初学者,应该可以提供一些初步的概念, 欢迎参考看看。