by Devin Yang

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

情境分享,设想您有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防毒攻略

最近刚看玩延禧攻略,就想来介绍个MacOS扫毒攻略。 这篇文章,教大家用如何用Docker搞定MacOS扫毒。 简单介绍,我们如何透过docker使用防毒软体扫毒。 这里假定目前我的目录是在我的家目录中,所以${PWD}就是目前的所在目录,会被挂载到container内的scan数据夹。 所以,使用clamscan -r /scan/,时就能扫描所有的挡案罗,加上-r的参数会使用递归的方式一层一层的进入子目录扫描。

wordpress, d-laravel, docker, docker-compose

如何用D-Laravel安装Wordpress

约8分钟的教程影片,介绍在D-Laravel上安装Wordpress. D-Laravel是一个docker-compose的Laravel框架开发环境,但不代表他不能拿来装别的东西。 这个影片,介绍使用D-Laravel安装非Laravel的PHP项目, 您可以学到D-Laravel上的相关命令用法: ./create --host用法, docker-compose up -d及 ./console mysql用法, D-Laravel v1.0.0版后的数据库连线设置方式。

d-laravel,docker

D-Laravel v1.2.1版变更说明(建议更新,必免踩雷)

D-Laravel v1.2.1版修正说明 use GuzzleHttp\Client; 进行post时.出现访问被拒的问题。 如果您是由旧版升级,您可能需调整etc/default-ssl.conf的设置档 (如果有该档) 请调整php:9000变更为web:9000,你可以透过运行一次./console secure调整。 docker-compose设置档部份,PHP-FPM container变更为network_mode: "service:web"...