情境分享,設想您有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