Home People Research Blog Courses Links Search Download
NCHC

Blog

Blog 最新文章

  1. Visual Studio 的遠端偵錯:Windows
    2021/03/24 14:45
  2. Visual Studio 2019 16.9 支援使用 OpenMP LLVM
    2021/03/03 13:52
  3. Valve 推出完全支援 OpenXR 的 SteamVR 1.16.8
    2021/02/25 09:43

Blog 最新回應

  1. 加入斜體文字...
    2021/02/07 21:06
  2. 加入斜體文字...
    2021/02/07 21:06
  3. 加入斜體文字...
    2021/02/07 21:06

Keyword 關鍵字

OpenGL Java WebGL CUDA OpenNI2 資訊地圖 資料視覺化 HTC Vive Pro Docker iFlyover OpenCV Vulkan Windows MR git PHP ASUS Xtion Pandas 3D立體 OpenNI 3d print VR Oculus Pandas MR Python Oculus Quest 2 Qt Boost C++14 C++17 GitLab Kinect C++20 HTC Vive 開放資料 開放資料 OpenCL OpenMP C++11 C++14 svn NiTE2 Oculus Rift S Valve Index C++ Docker HoloLens 2 HTC Vive Focus Python OpenXR OpenVR VR javascript xml CubeX

類別:技術相關 » 技術研究
文章發表|我要回應|RSS訂閱

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

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

張貼者:heresy於2020/08/06 13:33 下午有0則回應,瀏覽次數:401次

-- TOP --

我要回應
* 身份  訪客 (暱稱:)
 本篇文章作者 (帳號:密碼:)
* 內容      
很高興 悲傷 震驚 疑惑 大笑 發瘋 傷心
* 留言密碼 (請輸入下方圖片中去除前、後位數的數字,共五碼。)
說明 1. * 表示必填欄位。
2. 不支援HTML Tag。
   

-- TOP --

© Visualization and Interactive Media Laboratory of NCHC, 2007 - 2021, All Rights Reserved. Contact E-mail