SSH原理圖解
阿新 • • 發佈:2018-11-26
本文參考自不知小李的部落格
SSH(Secure Shell)是一套協議標準,可以用來實現兩臺機器之間的安全登入以及安全的資料傳送,其保證資料安全的原理是非對稱加密。
傳統的對稱加密是指客戶端和伺服器使用同一套祕鑰,洩露的風險很高;SSH是客戶端和服務端各自生成一套私鑰和公鑰,並且互相交換公鑰,這樣每一條發出的資料都可以用對方的公鑰來加密,對方收到後再用自己的私鑰來解密。(公鑰用來加密,私鑰用來解密)。
兩臺機器除了各自的一套公、私鑰之外,還儲存了對方的公鑰
1. 建立連線
- 客戶端發起連結請求
- 服務端返回自己的公鑰,以及一個會話ID(這一步客戶端得到服務端公鑰)
- 客戶端生成金鑰對
- 客戶端用自己的公鑰異或會話ID,計算出一個值,並用服務端的公鑰加密
- 客戶端傳送加密後的值到服務端,服務端用私鑰解密
- 服務端用解密後的值異或會話ID,計算出客戶端的公鑰(這一步服務端得到客戶端公鑰)
至此,雙方各自持有三個祕鑰,分別為自己的一對公、私鑰,以及對方的公鑰,之後的所有通訊都會被加密.
SSH雖然傳輸過程中很安全,但是在首次建立連結時並沒有辦法知道發來的公鑰是否真的來自自己請求的伺服器,如果有人在客戶端請求伺服器後攔截了請求,並返回自己的公鑰冒充伺服器,這時候如果連結建立,那麼所有的資料就都能被攻擊者用自己的私鑰解密了。這也就是所謂的中間人攻擊。
2. 利用密碼登入
2.1 賬號密碼登入
- 服務端收到登入請求後,首先互換祕鑰,詳細步驟如上一節所述。
- 客戶端用服務端的公鑰加密賬號密碼併發送
- 服務端用自己的祕鑰解密後得到賬號密碼,然後進行驗證
- 服務端用客戶端的公鑰加密驗證結果並返回
- 服務端用自己的祕鑰解密後得到驗證結果
2.2 利用公鑰登入(用於實現無密碼登入,如客戶端連線伺服器)
- 客戶端使用者必須手動地將自己的公鑰新增到伺服器一個名叫authorized_keys的檔案(儲存了所有可以遠端登入的機器的公鑰)。
- 客戶端發起登入請求,並且傳送一個自己公鑰的指紋(具有唯一性,但不是公鑰)
- 服務端根據指紋檢測此公鑰是否儲存在authorized_keys中
- 若存在,服務端便生成一段隨機字串,然後利用客戶端公鑰加密並返回
- 客戶端收到後用自己的私鑰解密,再利用服務端公鑰加密後發回
- 服務端收到後用自己的私鑰解密,如果為同一字串,則驗證通過
備註:github新增ssh方法
1. 檢視本機是否已經有SSH祕鑰,id_rsa.pub 或 id_dsa.pub 檔案
檔案路徑: ~/.ssh
2. 如果沒有,則需要建立一個 SSH key
ssh-keygen -t rsa -C "[email protected]"
程式碼引數含義:
> -t 指定金鑰型別,預設是 rsa ,可以省略。
> -C 設定註釋文字,比如郵箱。
> -f 指定金鑰檔案儲存檔名。
3. 新增 SSH key 到 github上面去
拷貝 id_rsa.pub 檔案的內容,點選 github上的Add SSH key 按鈕新增內容 。