今天是要補原本昨天就應該要做的TLS實作,而我們今天會用到Linux(我使用的是WSL,安裝方式可參考微軟官網https://learn.microsoft.com/zh-tw/windows/wsl/install),所以沒安裝的請記得先安裝。我們今天預計會有三個實作,從自簽憑證+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
第一個命令作用是產生私鑰以及伺服器的自簽憑證,做完結果如圖所示
而第二個則是啟動簡易 TLS server,結果如圖
接下來我們打開第二個終端並輸入以下指令進行client檢查:
openssl s_client -connect localhost:8443 -servername localhost
結果如圖
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進行簽發,所以第二個實作我安排了教大家如何自建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"
第二步.建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"
第三步.用CA簽發server憑證(產生chain)
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365 -sha256
第四步.啟動openssl s_server使用server.crt與server.key
openssl s_server -accept 8443 -cert server.crt -key server.key -WWW
終端二(客戶端)
在 client 端檢查並信任 CA
openssl s_client -connect localhost:8443 -CAfile ca.crt -servername localhost
這邊看到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編輯器畫面:
Linux指令畫面:
第一行的目的是開啟虛擬環境
第二行則是執行tls.py
終端機2
使用指令進行測試
openssl s_client -connect localhost:8443 -servername localhost -CAfile ca.crt
觀察現象
我們先在瀏覽器輸入https://localhost:8443/
,應該會跳出跟我一樣的畫面警告為不安全的頁面,這是因為我們尚未安裝ca.crt,在我們安裝完後網站就會可以正常顯示Hello
警告頁面:
我們接下來要把憑證匯出至電腦桌面
使用以下指令:
#複製到 Windows 桌面(路徑改成自己的)
cp ~/ca.crt /mnt/c/Users/User/Desktop/ca.crt
請記得先找到自己的ca.crt存放位置,接下來的安裝之前我們已經做過了,步驟相同,如有需要請自行服用day09(網址:https://ithelp.ithome.com.tw/articles/10382643),最後結果應該會跟我一樣
今天我們補了前面的漏掉的TLS實作實際了解TLS的運作模式,明天應該會進入DNS的實作