前言 – 資安安全性

上一章節 透過 GCP 從 0 開始的 WordPress 架站 – 我瘋程式工作室 建立了一個 WP 服務端,讓世界上所有用戶都能看到它,然而,當用戶進入頁面後卻發現網址端出現了令人尷尬的狀況…….

图片名称

圖片來源:HTTP 與 HTTPS的差異性

這代表網站的安全性受到質疑,任何在此網站做的事都是不安全的,client 端以及 server 端都無法確定彼此身份,特別是假如還有金流、會員等資訊傳遞,更是無法確保資料是否被竄改、攔截甚至擷取等狀況,資安狀況令人擔憂。

http、https、SSL 與 Domain Name

資安不安全狀況的網址呈現 http,故如果要讓這個網站的連線是安全的,通常我們會需要讓網頁 Server 端產生核可的 SSL 憑證並藉由供給 Domain Name 的域名註冊商 (例如 GoDaddy) 去認可我們的網頁網址,於是,具有 https 的網頁就誕生囉。

講了許多名詞,這邊也快速解釋一下~

http 與 https
http (HyperText Transfer Protocol) 早在 1898年被提出,早期只是滿足基本通訊需求,是一個沒有經過加密的明文通訊傳輸,也因此造成資安危機。

https (HyperText Transfer Protocol Secure),顧名思義增加了安全性 (Secure),透過 Client 和 Server 互相的認證、確認彼此身份達到安全的連線溝通。

SSL 憑證
SSL (Secure Sockets Layer),安全通訊協定,作為一個金鑰將雙方構通進行加密,確保資訊傳遞上的可靠性與保密性。

Domain Name
又叫做域名、網域,可以當作是 IP 位址的代稱,例如 wowfuncode.com 是一個域名,35.229.153.122就是他的 IP。

實作 SSL 連線

Step1 域名購買

相關域名供應商有許多,有興趣的朋友可以再自行 Google 一下,這邊我們是透過 GoDaddy 購買域名,名稱為 www.wowfuncode.com,買了域名後很快能做相關設定,主要設定是要讓域名與 IP 做個對應而已。

图片名称

Step2 SSL 憑證申請

申請憑證的簽發單位有許多,費用也不一,這邊我們是使用免費的 Let’s Encrypt – Free SSL/TLS Certificates 進行申請。

首先連進去 GCP VM,透過 GCP 提供的 SSH 方法快速連入

图片名称

安裝 Lego Client

進入 tmp 資料夾並且下載 lego 安裝檔

終端機輸入

cd /tmp
curl -Ls https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -

接著進行安裝,lego_vX.Y.Z 代表你所裝的版本

tar xf lego_vX.Y.Z_linux_amd64.tar.gz
sudo mkdir -p /opt/bitnami/letsencrypt
sudo mv lego /opt/bitnami/letsencrypt/lego

停止 nginx 才向 Let’s Encrypt 申請憑證,並重啟服務

sudo /opt/bitnami/letsencrypt/lego —tls —email="wowfuncode@gmail.com"  —domains="www.wowfuncode.com" —path="/opt/bitnami/letsencrypt" run
sudo /opt/bitnami/ctlscript.sh start nginx
sudo /opt/bitnami/ctlscript.sh restart nginx

生成的憑證存放位置

位置在 /opt/bitnami/letsencrypt/certificates

  • 裡面包含了四個檔案,檔名都是你的第一個 domain name

    图片名称

  • 兩個最重要的檔案一定要妥善保管,是 SSL 連線主要依據,也要避免上傳雲端

    • crt 檔案就是 public key
    • domain.com.key 就是 private key

Step3 Nginx Server 參數設定

將預設的憑證位置指到新的憑證

Bitnami 服務會有個預設的 SSL 憑證路徑:

/opt/bitnami/nginx/conf/server.crt
/opt/bitnami/nginx/conf/server.key

目前是假憑證,最方便的做法是將此兩個檔案直接指向正確憑證

sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.crt /opt/bitnami/nginx/conf/bitnami/certs/server.crt.old
sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.key /opt/bitnami/nginx/conf/bitnami/certs/server.key.old
sudo mv /opt/bitnami/nginx/conf/bitnami/certs/server.csr /opt/bitnami/nginx/conf/bitnami/certs/server.csr.old
sudo ln -sf /opt/bitnami/letsencrypt/certificates/DOMAIN.key /opt/bitnami/nginx/conf/bitnami/certs/server.key
sudo ln -sf /opt/bitnami/letsencrypt/certificates/DOMAIN.crt /opt/bitnami/nginx/conf/bitnami/certs/server.crt
sudo chown root:root /opt/bitnami/nginx/conf/bitnami/certs/server*
sudo chmod 600 /opt/bitnami/nginx/conf/bitnami/certs/server*

大致上的流程是:

  • mv 指令將舊的 SSL 憑證檔案改名,以 .old 做結尾
  • ln -sf 指令建立兩個鏈結 (link) 從預設的位置指向 Lego 生成的位置
  • chown root:root 指令設定憑證相關檔案的權限,只有 root user 可以存取

其他服務例如 apache 可以參考官網

打開 SSL 設定

指令開啟 nginx-vhosts.conf 檔案

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

ssl 開關(on)打開,並且設定 crt、key 路徑

ssl on;
ssl_certificate  "/opt/bitnami/nginx/conf/server.crt";
ssl_certificate_key  "/opt/bitnami/nginx/conf/server.key";

強制轉向到 https

指令開啟 nginx-vhosts.conf 檔案

vim  /opt/bitnami/apps/wordpress/conf/nginx-vhosts.conf

Server 內加入語法,使其網頁能

server {
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} !^(localhost|127.0.0.1)
  RewriteCond %{REQUEST_URI} !^/\.well-known
  RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]
}

以上,就能將一個網站設定為具有安全性憑證並且專業的網站囉!

相關系列文

系列文一:透過 GCP 從 0 開始的 WordPress 架站
系列文二:WordPress 實作 SSL