1. 前言
對工程師來說,幾乎每天都會用到的「SSH」為什麼能確保安全?本文將一步步帶你了解 SSH 通訊背後的機制。
2. SSH 連線的全貌
先來看 SSH 連線建立的整體流程。從客戶端發出連線請求,到最終開始安全的加密通訊,中間其實經過了多個步驟。
(下文會逐步解析圖示中的每個步驟)3. Step 1-2:通訊前的協商
在正式通訊開始前,客戶端與伺服器要先決定「要用什麼方式加密溝通」。
- 版本交換:雙方先交換 SSH 版本字串,例如
SSH-2.0-OpenSSH_8.2p1
。若版本不符,連線會直接中斷。 - 演算法交換:交換彼此支援的加密方式,主要有 4 種類型:
- 金鑰交換演算法(例如:ecdh-sha2-nistp256)
- 伺服器主機金鑰演算法(例如:ecdsa-sha2-nistp256)
- 對稱式加密演算法(例如:aes256-gcm@openssh.com)
- 訊息驗證碼 (MAC) 演算法(例如:hmac-sha2-256-etm@openssh.com)
這階段可能遇到「降級攻擊」(強迫使用舊的、不安全的演算法)。現代的 SSH 客戶端與伺服器通常會預設關閉不安全的演算法以防範攻擊。
4. Step 3-4:主機認證與工作階段金鑰生成
- 主機認證:伺服器用自己的「主機私鑰」簽名資料給客戶端,客戶端再用已知或首次儲存的「主機公開金鑰」驗證。這能避免 中間人攻擊 (MITM)。
- 驗證後的主機金鑰會存放在
~/.ssh/known_hosts
。 - 第一次連線時會看到提示:
Are you sure you want to continue connecting (yes/no)?
。
- 驗證後的主機金鑰會存放在
- 金鑰交換 (DH/ECDH):透過 Diffie-Hellman/ECDH 演算法,雙方能在被竊聽的情況下,仍安全生成相同的「一次性工作階段金鑰」。這個金鑰之後會用來加密整段通訊。
5. Step 5:使用者認證
確保登入伺服器的使用者身份正確。
- 公開金鑰認證:使用者用「私鑰」簽署資料,伺服器用已註冊的「公開金鑰」驗證。
- 不需在網路上傳輸固定密碼,安全性比