WP / 架站教學五:掛上 Domain 以及設定 SSL with Bitnami and NGINX

Quen Luo
18 min readApr 30, 2021

GCP 上有很多個版本的 WordPress 安裝包,每一個版本都會有一點點的不一樣,本篇(這一系列教學)是針對「WordPress with NGINX and SSL Certified by Bitnami and Automatic」來進行設定。

環境

設定 Domain Name

[介紹] Domain Name

每一台裝置在網路世界中都有一個屬於自己的地址 — IP 位址,通常會是一串的數字 XXX.XX.XX.XX,但對人來說這一串沒有邏輯的數字實在是不好記也不方便,你能想像要上網看個 Youtube 要輸入的不是 www.youtube.com 而是一串數字嗎?所以就有了 Domain Name 的出現。

舉例來說:www.youtube.com
其中的 youtube.com 是 domain name,前面的 www 則是 sub domain (子網域)。在註冊(購買)域名的時候是購買後面的 domain name,而前方的子域名都是擁有者可以任意新增上去的。

通常來說註冊 domain name 都是要付費的,價格其實和我們在購買車牌一樣基本的都不會太貴,若是較為特別的則是有可能會到需要拍賣競價來取得,至於要和誰購買呢?市面上有許多的服務商,比較有名像是 GoDaddy, name.com 或是 Google Domains。

壹、申請 Domain Name

以下以使用 Google Domains 來示範如何購買自己的網域

Google Domains

Google Domains 的定價不一定(絕對)不是所有服務商中最便宜的,但因為它可以配著 GSuite 一起使用,對於公司或需要有專屬郵件地址的使用者來說很方便,也提供了一些吸引人的免費服務:

  • Cloud DNS: Google 本身就有遍佈全球的 Cloud 伺服器,相信他們的 DNS 也是世界級的吧!可以快速的提供服務
  • 隱私保護: 保護我們的聯絡資料不在 WHOIS 和 RDAP 等平台上曝光
  • URL Forwarding: 直接於後台操作,簡單的轉址功能
網域轉址

但其實這項服務還是 Beta 版,也沒有正式在台灣地區完全開放,在註冊時可能會遇到一些小問題,介面可能也只有英文版,不過不會影響到使用和相關的權益。

操作模式很直覺,進入網站後在 search for your new domain 打上你想要的域名,依序操作即可,只要注意如果像要隱藏註冊資訊要記得在 Private 的地方勾選「Make my info private」,屆時會在網域總覽的頁面上看到隱私保護服務已啟用的字樣。

已啟用隱私保護服務

貳、將 IP 位址與 Domain Name 對應

Step1. VM 設定外部靜態 IP (external IP address)
在我們剛建立 VM 時,對外的 IP 位置其實是不固定的,每一次重新開機都可能會拿到不同的 IP 位址,所以當我們要將 Domain 只過來之前,要先將對外的 IP 設定為靜態的 (static) 。

進入 GCP 控制台後,點選「VPC 網路」>「外部 IP 位址」,看到想要從臨時 IP 改為靜態 IP 的 VM,在狀態的地方選擇「靜態」

選擇靜態 IP

接著會跳出一個視窗要我們填寫設定此靜態 IP 的名稱和說明,填寫完後按下確定就完成了。

設定名稱

回到頁面便能夠看到狀態已經更改為「靜態」

設定靜態 IP 完成

Step2. 將網址指向 IP Address
設定的方式有很多種,這次我們使用最基本的 A Record 來設定

回到 Domain 服務商的控制台頁面,選擇 「DNS

進入 DNS 設定

最下方的「自訂資源紀錄」填上剛剛的 IP 位址,再按下新增就可以了。
這邊如果你沒有要單使用其中一個子域名的話,第一格直接保留使用 @ 即可。舉例來說,當我們申請的 Domain Name 叫做 domain.name,而我們只想要將 blog.domain.name 投射到該 IP 上,則第一個空格要填上 blog。

設定 A Record

可能要等一段時間讓 DNS 更新,基本上這樣就已經指到 IP 上了,但後面會需要針對 WordPress 做一些小設定,我們和 SSL 憑證一起進行。

申請 SSL 憑證

[介紹 ] SSL ,TLS, HTTPS

HTTP > HyperText Transfer Protocol,是全球資訊網路(www)的資料通訊基礎,簡單想可以把它想成為讓瀏覽器 (web server) 讀取網站內容的一樣協議,但事實上這項協議本身不會判斷發送方的身份以及是否真的由預想的接收方接收到、且接收完成。因此,我們需要加上「加密」的步驟,而常常看到的 https 中的 s 就代表著透過 SSL/TSL 進行加密,最明顯判斷是否為加密的安全網站就是看前面的鎖頭。

有鎖頭的加密網站

SSL > Secure Socket Layer ,是全球公認的安全技術標準。能夠防範兩個系統 (主機) 間的溝通被惡意竄改或竊取,其中包括重要的信用卡資訊、財務資訊、姓名地址等個人資料。
包含了紀錄層和傳輸層,前者是用來確定傳輸層資料封裝格式的協定,後者則是使用了非對稱加密演算法來對通訊方作身份認證,之後交換對稱金鑰來作為 Session Key,再拿 Session Key 來將要交換的資料做加密,以此來確保兩者間的保密性和可靠性。
然而隨著網際網路越發成熟, SSL 的缺點變越發明顯,例如無法判斷憑證是否屬於目的網站,當有多個網站同時使用一樣的 IP 位址時,便會發生問題。

SSL 運作流程

TLS > Transport Layer Security 傳輸層安全性協定是用於取代 SSL 加密的協定,比 SSL 更加的安全,解決了 SSL 無法判斷是哪個來源網站的問題,已成為目前許多主流網站的通訊標準。詳細的流程這邊就不寫太多,有興趣的話未來在寫文章來介紹清楚一點。
而 TLS 陸續有公佈更新的版本,目的是補強各種被發現的重大漏洞。TLS 1.0, TLS 1.1 分別在 1999 年、2006 年公布,2021 年(Google, Apple, Microsoft, Mozilla)棄用,所以後面會教大家如何設定只保留 TLS 1.2 和 TLS 1.3。

[介紹] Let’s Encrypt, Lego

簽發憑證(CA)的單位有非常多,也分成許多的等級,相對的費用與服務內容也不太一樣,當然也有免費的簽發單位,這邊我們使用的是 Let’s Encrypt,需要透過下指令來申請,其憑證的有效日期也只有 90 天,也就是需要定期的更新憑證。

Requesting revocation of a certificate for example.com

至於如何申請憑證 Let’s Encrypt 官網有詳細的指令說明,首先是要證明我們對域名的控制權,最方便的方法就是透過 ACME 協議的軟體來處理,其官網是建議使用 Certbot,但因為我們所使用的 WordPress with NGINX and SSL Certified by Bitnami and Automatic 有做過優化設定,所以沒辦法直接讓我們透過 Certbot 來處理,從 Bitnami 的說明文件看來,他希望我們透過 Lego 來建立 SSL 連線。

LEGO: https://go-acme.github.io/lego/

壹、使用 Lego 處理 SSL 憑證

Step1. ssh 連線進入有安裝 WordPress 的 VM

開啟 SSH

!!以下步驟為參考 Bitnami 官方文件,請注意都要使用 Nginx 的版本!!
!!使用的是 Nginx, Approach B: Self-contained installation

如果不確定自己是 Approach A 還是 B,請先用以下指令確定

test ! -f "/opt/bitnami/common/bin/openssl" && echo "Approach A: Using system packages." || echo "Approach B: Self-contained installation."

Step2. 安裝 Lego

依序輸入以下指令於終端機介面中,其中第三個指令 lego_vX.Y.Z_linux_amd64.tar.gz 的 X.Y.Z 代表的是 lego 的安裝版本,會依照第二個指令運行完成後所出現的資訊來填寫

cd /tmpcurl -Ls https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -
安裝 LEGO
tar xf lego_vX.Y.Z_linux_amd64.tar.gzsudo mkdir -p /opt/bitnami/letsencryptsudo mv lego /opt/bitnami/letsencrypt/lego

Step3. 停止 Nginx MySQL

sudo /opt/bitnami/ctlscript.sh stop
停止伺服器

Step4. 開始申請憑證

sudo /opt/bitnami/letsencrypt/lego --tls --email="你的信箱" --domains="你的網域" --domains="你的其他網域" --path="/opt/bitnami/letsencrypt" run

舉例來說,我(信箱 me@domain.name)已經將 domain.name 還有 www.domain.name 指向這台 IP 就可以這樣寫:

sudo /opt/bitnami/letsencrypt/lego --tls --email="me@domain.name" --domains="domain.name" --domains="www.domain.name" --path="/opt/bitnami/letsencrypt" run

當然如果只有一個網域要使用,只需要帶入一個就好。首次使用會詢問是否接受 TOS,就是問我們接不接受使用者條款的意思啦!
TOS > terms of service

TOS

如果沒有跳出 error 訊息的話,就代表成功了,如果出現失敗的話,有可能是你的網域還沒指過來(DNS 沒更新),再等一下再試即可,或是檢查是否網域, IP 打錯。

Step5. 將申請好的憑證掛上 Nginx

申請憑證成功後,要讓 Nginx 讀取,記得在四和五指令上將 你的網域 更改成自己的網域。

sudo mv /opt/bitnami/nginx/conf/server.crt /opt/bitnami/nginx/conf/server.crt.oldsudo mv /opt/bitnami/nginx/conf/server.key /opt/bitnami/nginx/conf/server.key.oldsudo mv /opt/bitnami/nginx/conf/server.csr /opt/bitnami/nginx/conf/server.csr.oldsudo ln -sf /opt/bitnami/letsencrypt/certificates/你的網域.key /opt/bitnami/nginx/conf/server.keysudo ln -sf /opt/bitnami/letsencrypt/certificates/你的網域.crt /opt/bitnami/nginx/conf/server.crtsudo chown root:root /opt/bitnami/nginx/conf/server*sudo chmod 600 /opt/bitnami/nginx/conf/server*

Step6. 重啟服務

sudo /opt/bitnami/ctlscript.sh start

貳、檢查網域與測試憑證

Step1. 檢查 WordPress 參數檔

路徑: /opt/bitnami/apps/wordpress/conf/nginx-vhosts.confserver_name my.domain www.my.domain

要檢查是否 server_name 已經是我們的 domain 了

Step2. 設定 wp-config.php

路徑:/opt/bitnami/apps/wordpress/htdocs/wp-config.php
將原本的 http 改為 https
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

測試憑證:SSL Server Test
https://www.ssllabs.com/ssltest/analyze.html

參、設定自動定期更新 SSL 憑證

因為 Let’s Encrypt 的憑證 90 天會過期,必須要一直更新,所以我們要來設定讓系統會自動在到期前更新憑證。

Step1. 建立 shell 檔

sudo mkdir -p /opt/bitnami/letsencrypt/scriptssudo vim /opt/bitnami/letsencrypt/scripts/renew-certificate.sh

進入 vim 後將以下內容貼上,一樣要改掉 “你的信箱”、“你的網域”

#!/bin/bash

sudo /opt/bitnami/ctlscript.sh stop nginx
sudo /opt/bitnami/letsencrypt/lego --tls --email="你的信箱" --domains="你的網域" --path="/opt/bitnami/letsencrypt" renew --days 60
sudo /opt/bitnami/ctlscript.sh start nginx

儲存退出後將權限改為可執行的

sudo chmod +x /opt/bitnami/letsencrypt/scripts/renew-certificate.sh

Step2. 加入 cronjob 定期執行

sudo crontab -e

在 crontab file 中加入以下一行內容(建議加在檔案最後面),這項設定會讓 shell 檔在每個月的 1 號被執行。

0 0 1 * * /opt/bitnami/letsencrypt/scripts/renew-certificate.sh 2> /dev/null

肆、設定開啟 TLS 1.3

上面有提到 TSL 1.1 和 1.0 已經在 2021 年不被支援,以下就要來設定 Nginx 只接受 TLS 1.2 以上的連線。

Step1. 打開 Nginx 設定檔

/opt/bitnami/nginx/confsudo vim nginx.conf

Step2. 更改設定

找到 ssl_protocols ,將後方的 TSLvX.X 只留下 (新增) 1.2 和 1.3,可能會有兩行會需要改(port 80 和 port 443)。

ssl_protocols TLSv1.2 TLSv1.3;

Step3. 重新啟動 Nginx

改好之後要重新啟動 Nginx

sudo /opt/bitnami/ctlscript.sh restart nginx

確定沒有出現錯誤訊息之後,也可以到 SSL Server Test 上再測試一次

enable TLSv1.3

設定 DNS CAA 紀錄

[介紹] DNS

網域名稱系統 (DNS) 可以說是網際網路的電話簿,當我們想要透過域名存取網站內容時,DNS 會將網域轉為 IP 位址,以便瀏覽器能夠找到網站主機,並將其資訊載入。

想要了解更詳細的運作機制請參考:https://www.cloudflare.com/zh-tw/learning/dns/what-is-dns/

壹、使用 CCA Record Helper 設定 CAA Record 內容

如果有使用測試網站來測試 SSL 狀況的話,應該有些人會發現網站的狀態在 CAA 的地方又出現警告錯誤,可以按照以下步驟將 CAA 紀錄給設定上去。

Step1. 產生 CAA Record

這是使用 SSLMate 提供的 CAA Record Helper 來協助產生,在第一個區塊「Enter Your Domain Name」填上自己的網域名,再於第二區塊「Choose an Initial Policy」按下最後一個「Load Current Policy」。

CAA Record Helper

Step2. 將結果複製到網域服務商中

這步驟會一個服務商而有所不同,先往下滑到「5. Publish Your CAA Policy」,會看到好幾項結果,這邊以 Google Cloud DNS 為例,也就是使用第一個「Generic」的結果,填入 Google Domains 的「自訂資源紀錄」中。

自訂資源紀錄

Step3. 檢查

稍微等待幾分鐘後,可以再次回到 CAA Record Helper
一樣填入 Domain 後點擊「Load Current Policy」,來載入目前的狀況,如果有設定成功就會出現紀錄。

CAA 設定成功

如果設定失敗的話,則是會跳出視窗「YORU_DOMAIN does not have a CAA policy. Any certificate authority can issue certificates.

CAA 設定失敗

補, 其他設定

壹、強制轉向 https

參考官方說明文件(Force HTTPS Redirection With NGINX)

Step1. 修改 conf

路徑:/opt/bitnami/nginx/conf/bitnami/bitnami.conf在第一個 server 區塊中加入
return 301 https://$host$request_uri;
-
最後的 server 應該長這樣
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
include "/opt/bitnami/nginx/conf/bitnami/bitnami-apps-prefix.conf";
}

Step2. 重新啟動 Nginx

## 測試
sudo nginx -t
## 重啟
sudo /opt/bitnami/ctlscript.sh start nginx

貳、使用 PageSpeed

參考官方說明文件 (Use PageSpeed With NGINX)

Step1. 修改 conf

路徑:/opt/bitnami/nginx/conf/bitnami/bitnami.conf將下方的所有內容都加進 server 區塊pagespeed on;
pagespeed FileCachePath /opt/bitnami/nginx/var/ngx_pagespeed_cache;
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
location ~ "^/ngx_pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon$" { }

Step2. 重新啟動 Nginx

--

--