iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0

我們在 D13 - NGINX Image 時介紹了 NGINX 的基本用法,

假設我們的 API 開發完成,Domain 跟 DNS 也處理好了,NGINX 也導向我們的 API 服務,
接下來,距離把 API 提供給前端串接,就剩下最後一步了,

為了安全考量,我們必須替 API 簽署 SSL 憑證,把 API 從 HTTP 架成 HTTPS
例如從 http://louis.example.com 變成 https://louis.example.com,有了憑證跟 HTTPS 的安全機制,才能保護使用者的 Request 不受駭客竊聽,Request 傳輸的內容會被加密,只有 Client (使用者的瀏覽器) 跟 Server 才有辦法解開並看到內容,

因此,今天的主題就是研究如何借助 Docker 來處理 SSL 憑證。


Certbot

如果不想購買付費的 SSL 憑證,第一首選就是使用 Let'sEncryptCertbot 的組合技,

Let'sEncrypt 這個網站可以申請免費的憑證,當然,前提是我們擁有要申請憑證的網域,

而 Certbot 則是一個能自動處理申請的工具,它能夠自動讀取 NGINX 的設定檔,讀取找出我們設定的網域,接著向 Let'sEncrypt 申請對應的憑證來使用,
還能自動判斷憑證的過期時間,幫我們更新憑證,


jonasal/nginx-certbot Image

jonasal/nginx-certbot 這個 Docker image 雖然這不是官方的 Image,但同樣也有很高的使用量,
它把 NGINX 跟 Certbot 結合起來後,讓我們可以用 Docker 架設好 NGINX 的同時,也把 HTTPS 處理好,

更詳細的介紹,讀者可以閱讀他們的 Docker hub 或 Github 首頁,

Config

雖然說是研究,但嘗試之後才發現它真的很容易使用,很簡單的設定就能讓 Certbot 正常運作,
讓我們直接看設定檔:

# docker-compose.yml

version: '3'

services:
  nginx:
    image: jonasal/nginx-certbot:3
    restart: unless-stopped
    environment:
      - CERTBOT_EMAIL=your-email@example.com
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./letsencrypt:/etc/letsencrypt
      - ./user_conf.d:/etc/nginx/user_conf.d

其中是 CERTBOT_EMAIL 是必要的環境變數,為的是讓 Certbot 可以對簽署者寄送重要的通知,

Port 的部分,因為要把 80 Port 的流量都導向 443 (HTTPS 預設使用的 Port),因此這兩個 Port 都需要用到,

Volume 綁定了兩個資料夾,
第一個 letsencrypt/ 資料夾,是儲存 SSL 憑證檔案的地方,
第二個 user_conf.d/ 資料夾,這是 nginx-certbot image 特別定義的,用來讓我們放入自訂的 NGINX 設定檔,
如果讀者好奇這個資料夾的設計原因,可以進一步閱讀 The user_conf.d Folder 的說明。

再來是我們的 NGINX 設定檔,請把 louis-ithelp.example.com 的地方替換成你所擁有的網域:

# user_conf.d/louis.conf

server {
    # Listen to port 443 on both IPv4 and IPv6.
    listen 443 ssl default_server reuseport;
    listen [::]:443 ssl default_server reuseport;

    # Domain names this server should respond to.
    server_name louis-ithelp.example.com;

    # Load the certificate files.
    ssl_certificate         /etc/letsencrypt/live/louis/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/louis/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/louis/chain.pem;

    # Load the Diffie-Hellman parameter.
    ssl_dhparam /etc/letsencrypt/dhparams/dhparam.pem;

    return 200 'Let\'s Encrypt certificate successfully installed!';
    add_header Content-Type text/plain;
}

以上的設定檔都是從官方的 Github Repo 中找到的範例,讀者也可以到 Example 看看,

執行 docker compose 後,根據官方文件所說,需要稍等一下下,等待 Certbot 執行完 SSL 的簽署,

sudo docker compose up -d

接著就能使用我們的 HTTPS 網站了:

Certbot


到此,一個基本的 HTTPS API 服務就用 Docker 給運作起來了,

如果你已經擁有一個網域,可以馬上來試一下,
如果還沒有的話 ... 你也可以馬上買一個 ヽ(✿゚▽゚)ノ

那今天的研究就到這邊,程式碼可以在 這裡 找到。


上一篇
D14 - Vue with NGINX
下一篇
D16 - 比喻 — 片場
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言