讓你的網站更安全,加上 SSL 憑證吧!

後端:「我把我的後端加上 https 囉!你也幫你的前端加一下吧!」
我:「蛤?!」
後端:「你可以先產一個自簽憑證出來掛上去,我請網管去拿正式憑證。」
我:「蛤...」
我:「那是像員工證一樣掛在伺服器上就可以了嗎?」

產出自簽 SSL 憑證

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ssl/nginx-selfsigned.key -out ./ssl/nginx-selfsigned.crt

-x509: 指定要生成自簽憑證。
-nodes: 不加密私鑰。
-days 365: 設定憑證的有效期為 365 天。
-newkey rsa:2048: 建立一個新的 RSA 私鑰,長度為 2048 位,並使用該密鑰生成憑證。
-keyout ./ssl/nginx-selfsigned.key: 指定私鑰儲存位置。
-out ./ssl/nginx-selfsigned.crt: 指定憑證儲存位置。

產出憑證以前 CLI 會詢問你一些國家跟區域的基本資訊,其中比較重要的是 Common Name (CN),這個欄位要填入網址的 domain。

現在,你應該有 private key & cert 兩個檔案了,下一步要想的是如何把它們"掛"上去 👆~

修改 nginx 設定,讓它監聽 https 的 443 port

還記得我們前一篇文章學到的 nginx 跟 docker 嗎?

我們之前只有監聽 http 預設的 80 port
現在讓我們加上監聽 443 port 的部分...

default.conf.template:

server {
  include   /etc/nginx/mime.types;
  default_type  application/octet-stream;
  root  /usr/share/nginx/html/;
  absolute_redirect off;
  listen 80;
  location ^~ /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://api;
  }
  location ^~ / {
    try_files $uri /index.html;
  }
}
server {
  include   /etc/nginx/mime.types;
  default_type  application/octet-stream;
  root  /usr/share/nginx/html/;
  absolute_redirect off;
  listen 443 ssl;
  ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt
  ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key
  location ^~ /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://api;
  }
  location ^~ / {
    try_files $uri /index.html;
  }
}
upstream api {
  server ${API_HOST}:${API_PORT}
}

眼尖的讀者應該發現了,兩個 server {} 區塊其實只有這三行不同:

listen 443 ssl;
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key

記得 ssl 一定要加喔!不然你依舊會 host 一個 http (血淋淋的親身經歷 😥)。
路徑的部分因為我們專案是跑在 docker 裡面的,所以還要想辦法把這個內部路徑指到外面機器的./ssl/

那就讓我們來看看 docker 要怎麼改吧!

修改 Dockerfile

...
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]

只改了一行 EXPOSE 80 443,讓 docker 多把 443 port 開出來。

修改 docker-compose.yaml

version: '3'
services:
  web:
    ...
    ports:
      - 3000:80
      - 3010:443
    volumes:
      - ./ssl:/etc/nginx/ssl
  • 讓容器內的 443 port 對應到外部的 3010 port。
  • 新增 volumes: - ./ssl:/etc/nginx/ssl 讓 docker 內部的 /etc/nginx/ssl 可以直接掛載到外面的 ./ssl也就是我們一開始用 openssl 產出來的私鑰跟憑證的存放位置。

重跑 docker compose up --build -d 就大功告成了!

是不是比想像中的要簡單呢?

如果要換成正式憑證只要把它丟進去前面設定好的路徑就可以了,這也是為什麼我採用掛載的方式。

注意:使用自簽憑證的時候,chrome 會跳出是否信任此網站的提示,點擊確認前往就可以了。

results matching ""

    No results matching ""