使用 CertBot 自動取得 Apache 的 SSL 憑證

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 對於這些後臺設定的東西其實沒那麼熟,這邊基本上應該只能算是自己邊摸邊學的紀錄,很有可能還有更好的做法。

如果有人有更好的做法,也歡迎提供建議了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。