Heresy 這邊有在使用 Apache + PHP 的 Docker(實際上是 php:apache 這個 Docker Image)在架設測試用的網站;而由於現在網站都是建議要使用 https,所以一開始是自己去 Let’s Encrypt(官網)申請憑證來用。不過由於他發的 SSL 憑證期限是三個月,所以就必須要定時更新才行。
為了避免之後忘了更新,其實最好是像要辦法設定成自動更新的模式。而目前,也已經有 CertBot(官網)這類的工具,可以來協助完成 SSL 的憑證設定、更新了!
這邊基本上就是紀錄一下 Heresy 自己在 Apache + PHP 的 Docker 內、設定 CertBot 的方法。
由於 Heresy 這邊的作法是會建立一個 Web Server 的 Docker Image、佈署到內部測試機器以及對外服務的機器,內部的機器由於外部連不進來,所以無法使用 CertBot 來自動設定 SSL 憑證。
所以 Heresy 這邊的作法,是以內部用的 SSL 憑證為主,外部才使用 CertBot 取得 Let’s Encrypt 的憑證。
Web Server Docker Image
首先,Heresy 這邊的 Apache 的設定檔內容是:
<VirtualHost *:80>
DocumentRoot /var/www/html2 </VirtualHost> <VirtualHost *:443>
DocumentRoot /var/www/html
ServerName xxx.ddns.net
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/certificate.crt
SSLCertificateChainFile /etc/apache2/ssl/ca_bundle.crt
SSLCertificateKeyFile /etc/apache2/ssl/private.key
</VirtualHost>
其中,HTTP 的 80 port 是要用來在取得憑證的時候驗證用的,之後會自動導向到 HTTPS;而HTTPS 的 443 port 的虛擬主機,則是真正對外服務的用的。
下面的 SSL 相關設定,則是內部測試網站用的的憑證資訊。
而這邊的 Dockerfile 則是寫成:
FROM php:apache MAINTAINER Heresy # update RUN apt update -y RUN apt upgrade -y # install mySQL for PHP RUN docker-php-ext-install mysqli RUN docker-php-ext-enable mysqli # Apache setting ADD ./HTML /var/www/html ADD ./ssl /etc/apache2/ssl ADD ./000-default.conf /etc/apache2/sites-available/000-default.conf RUN a2enmod ssl
下面「Apache setting」的部分,則是把必要的檔案複製到這個 Docker image 內;其中 HTML 就是網頁的內容、ssl 則是內部網站用的憑證,000-default.conf 則是上面的設定檔。
CertBot
其中,黃底的「apt install certbot python3-certbot-apache -y」就是用來安裝 CertBot 的指令。
之後,等到這個 Web Server 的 Docker 起來後,則可以進入 Docker 容器內、透過下面的指令,來透過 CertBot 來取得 SSL 憑證、並進行相關的設定:
certbot --apache --non-interactive --agree-tos -m xxx@gmail.com --domain xxx.ddns.net
上面的電子郵件、以及網域,也請自行更改。
等他執行完後,應該就可以完成 SSL 憑證的設定了!
而之後,則可以透過 certbot renew 這個指令,來進行憑證的更新。
不過由於這邊通常是剛申請的,所以當下直接執行的話,應該都會出現「Cert not yet due for renewal」這樣的訊息、告訴使用者還不需要更新。
如果要測試是否可以更新的話,則可以使用「certbot renew –dry-run」來做確認。
自動更新
而如果要讓他可以自動更新憑證的話,則可以透過設定系統的排程來完成。
不過由於 php:apache 的 Docker image 並沒有內建 systemd、裝起來好像也有問題,所以沒辦法照官方網站的做法來完成自動更新。
這邊研究了一下,後來是決定透過 crontab 來做排程更新;而如果要這樣做的話,這邊則是另外 cron。
這邊現在的做法,是在整個 Web Server 的容器(假設名稱是 web)跑起來後,再執行下列的指令:
docker exec web apt install certbot python3-certbot-apache cron -y' docker exec web service cron start' docker exec web certbot --apache --non-interactive --agree-tos -m xxx@gmail.com --domain xxx.ddns.net' docker exec web sh -c "crontab -l | { cat; echo "0 23 * * * /usr/bin/certbot renew"; } | crontab - "'
這邊第一行是透過 apt 安裝需要的套件,第二行則是啟動 cron 的服務。
第三行則是前一段、向 Let’s Encrypt 要求憑證的指令;第四行,則就是設定 crontab,讓系統每天 23:00 去執行 certbot renew 的指令、在必要的時候更新憑證了~
(要修改時間可以參考 crontab guru)
這篇大概就是這樣了。
老實說,Heresy 對於這些後臺設定的東西其實沒那麼熟,這邊基本上應該只能算是自己邊摸邊學的紀錄,很有可能還有更好的做法。
如果有人有更好的做法,也歡迎提供建議了。