iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0

今天是要補原本昨天就應該要做的TLS實作,而我們今天會用到Linux(我使用的是WSL,安裝方式可參考微軟官網https://learn.microsoft.com/zh-tw/windows/wsl/install),所以沒安裝的請記得先安裝。我們今天預計會有三個實作,從自簽憑證+openssl s_server到將憑證運用在實際服務。

一.自簽憑證 + openssl s_server

這個實作我們需要開兩個終端機,一個做為伺服器,一個做為客戶端

首先我們先在第一個終端機執行以下命令:

openssl req -x509 -newkey rsa:2048 -days 365 \
  -nodes -keyout key.pem -out cert.pem \
  -subj "/CN=localhost"
以及
openssl s_server -accept 8443 -cert cert.pem -key key.pem -www

第一個命令作用是產生私鑰以及伺服器的自簽憑證,做完結果如圖所示
https://ithelp.ithome.com.tw/upload/images/20251001/20178008KNPPktbkq7.png
而第二個則是啟動簡易 TLS server,結果如圖
https://ithelp.ithome.com.tw/upload/images/20251001/20178008ZwbWNFjTIg.png
接下來我們打開第二個終端並輸入以下指令進行client檢查:

openssl s_client -connect localhost:8443 -servername localhost

結果如圖
https://ithelp.ithome.com.tw/upload/images/20251001/20178008zjfHpdRL6u.png
https://ithelp.ithome.com.tw/upload/images/20251001/20178008qIF1ObNMMf.png
會看到一大串東西,不過我們這個實作最主要會要看的是我上面截圖的部分,可以看到Protocol:TLSv1.3、Cipher:TLS_AES_128_GCM_SHA256、以及重點Verify return code: 18 (self signed certificate)這表示我們使用的是自簽憑證,client預設為不信任。這對我們這個實作測試是沒問題的但真實情況還是要CA簽發。

二.建自建CA,簽發server cert

剛才我們講到在真實情況下還是需要CA進行簽發,所以第二個實作我安排了教大家如何自建CA並模擬真實CA被信任,而步驟大概如下,我們會先建CA,用CA替server簽憑證最後將Client設定為可信任CA。(一樣要兩個終端)
終端一(伺服器)
第一步.建CA私鑰與根憑證

openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
  -subj "/CN=MyTestCA"

https://ithelp.ithome.com.tw/upload/images/20251001/20178008ya6IURLoEL.png
第二步.建server私鑰與CSR

openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key server.key -out server.csr -subj "/CN=localhost"

https://ithelp.ithome.com.tw/upload/images/20251001/201780081cvrfGoyls.png
第三步.用CA簽發server憑證(產生chain)

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out server.crt -days 365 -sha256

https://ithelp.ithome.com.tw/upload/images/20251001/20178008F9VztlnkQc.png
第四步.啟動openssl s_server使用server.crt與server.key

openssl s_server -accept 8443 -cert server.crt -key server.key -WWW

https://ithelp.ithome.com.tw/upload/images/20251001/20178008j26Q77fA6f.png
終端二(客戶端)
在 client 端檢查並信任 CA

openssl s_client -connect localhost:8443 -CAfile ca.crt -servername localhost

https://ithelp.ithome.com.tw/upload/images/20251001/20178008LqNZ8BFDzc.png

這邊看到Verify return code: 0 (ok)表示我們實作成功讓client用ca.crt驗證成功

三.將憑證用在實際服務

用剛簽的server.crt/server.key啟動一個HTTPS服務,並用瀏覽器openssl s_client訪問,把TLS與HTTP結合。
終端機1

在有server.crt/server.key的目錄下執行tls.py

#tsl.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "Hello"

if __name__ == '__main__':
    # 使用剛才簽好的 server.crt 和 server.key
    app.run(host='0.0.0.0', port=8443, ssl_context=('server.crt','server.key'))

nano編輯器畫面:
https://ithelp.ithome.com.tw/upload/images/20251001/20178008aVxg0VNkNO.png
Linux指令畫面:
https://ithelp.ithome.com.tw/upload/images/20251001/201780084efOQwKHII.png
第一行的目的是開啟虛擬環境
第二行則是執行tls.py

終端機2

使用指令進行測試

openssl s_client -connect localhost:8443 -servername localhost -CAfile ca.crt

觀察現象
我們先在瀏覽器輸入https://localhost:8443/,應該會跳出跟我一樣的畫面警告為不安全的頁面,這是因為我們尚未安裝ca.crt,在我們安裝完後網站就會可以正常顯示Hello

警告頁面:https://ithelp.ithome.com.tw/upload/images/20251001/20178008KB96RKZtuZ.png

我們接下來要把憑證匯出至電腦桌面
使用以下指令:

#複製到 Windows 桌面(路徑改成自己的)
cp ~/ca.crt /mnt/c/Users/User/Desktop/ca.crt

請記得先找到自己的ca.crt存放位置,接下來的安裝之前我們已經做過了,步驟相同,如有需要請自行服用day09(網址:https://ithelp.ithome.com.tw/articles/10382643),最後結果應該會跟我一樣
https://ithelp.ithome.com.tw/upload/images/20251001/20178008hbzET8C54o.png

今日小結

今天我們補了前面的漏掉的TLS實作實際了解TLS的運作模式,明天應該會進入DNS的實作


上一篇
Day20-認識DNS
下一篇
Day22-DNS實作
系列文
Izumi從零開始的30日WEB馬拉松22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言