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

需要登入才可留言!

類似的文章


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"...

docker

關於Docker的Logging Driver

Docker內建相當多的日誌機制,幫我們取得在container內執行的服務資訊。 這些機制(mechanisms)我們通常稱為logging drivers.

config,ssl,certbot

Apache及Nginx的ACME驗證通殺

有人或許會好奇記這個做什麼,我大概說明一下我的情境,超老舊主機,沒Docker也沒法裝HAProxy或certbo,就只有apache及nginx。但我需要在該主機上自動申請及更新憑證,所以我透過NFS,讓該主機掛載另一台可以跑certbot程式主機上的資料夾,讓他生成的驗證檔直接產生在舊主機上/home/nginx/acme-challenge/.well-known/acme-challenge/目錄內,網頁就能夠順利驗證,並取得憑證啦。有一堆vhost時,可以全部吃同一個資料夾,而不是每個vhost網站都去建目錄。