一口氣把 SSH 原理搞懂了
來源:https://www.cnblogs.com/cjsblog/p/9476813.html
SSH(Secure Shell,安全外殼)是一種網絡安全協議,通過加密和認證機制實現安全的訪問和文件傳輸等業務。傳統遠程登錄或文件傳輸方式,例如 Telnet、FTP,使用明文傳輸數據,存在很多的安全隱患。隨着人們對網絡安全的重視,這些方式已經慢慢不被接受。SSH 協議通過對網絡數據進行加密和驗證,在不安全的網絡環境中提供了安全的登錄和其他安全網絡服務。作爲 Telnet 和其他不安全遠程 shell 協議的安全替代方案,目前 SSH 協議已經被全世界廣泛使用,大多數設備都支持 SSH 功能。
目錄
SSH 端口號是什麼?
SSH 是如何工作的?
使用 PuTTY 和 OpenSSHSSH 密鑰
SSH 端口號是什麼?
當 SSH 應用於 STelnet,SFTP 以及 SCP 時,使用的默認 SSH 端口都是 22。當 SSH 應用於 NETCONF 時,可以指定 SSH 端口是 22 或者 830。SSH 端口支持修改,更改後當前所有的連接都會斷開,SSH 服務器開始偵聽新的端口。
SSH 是如何工作的?
SSH 由服務器和客戶端組成,在整個通信過程中,爲建立安全的 SSH 通道,會經歷如下幾個階段:
連接建立
SSH 服務器在指定的端口偵聽客戶端的連接請求,在客戶端向服務器發起連接請求後,雙方建立一個 TCP 連接。
版本協商
SSH 協議目前存在 SSH1.X(SSH2.0 之前的版本)和 SSH2.0 版本。SSH2.0 協議相比 SSH1.X 協議來說,在結構上做了擴展,可以支持更多的認證方法和密鑰交換方法,同時提高了服務能力。SSH 服務器和客戶端通過協商確定最終使用的 SSH 版本號。
算法協商
SSH 支持多種加密算法,雙方根據各自支持的算法,協商出最終用於產生會話密鑰的密鑰交換算法、用於數據信息加密的加密算法、用於進行數字簽名和認證的公鑰算法以及用於數據完整性保護的 HMAC 算法。
密鑰交換
服務器和客戶端通過密鑰交換算法,動態生成共享的會話密鑰和會話 ID,建立加密通道。會話密鑰主要用於後續數據傳輸的加密,會話 ID 用於在認證過程中標識該 SSH 連接。
用戶認證
SSH 客戶端向服務器端發起認證請求,服務器端對客戶端進行認證。SSH 支持以下幾種認證方式:
-
密碼(password)認證:客戶端通過用戶名和密碼的方式進行認證,將加密後的用戶名和密碼發送給服務器,服務器解密後與本地保存的用戶名和密碼進行對比,並向客戶端返回認證成功或失敗的消息。
-
密鑰(publickey)認證:客戶端通過用戶名,公鑰以及公鑰算法等信息來與服務器進行認證。
-
password-publickey 認證:指用戶需要同時滿足密碼認證和密鑰認證才能登錄。
-
all 認證:只要滿足密碼認證和密鑰認證其中一種即可。
會話請求
認證通過後,SSH 客戶端向服務器端發送會話請求,請求服務器提供某種類型的服務,即請求與服務器建立相應的會話。
會話交互
會話建立後,SSH 服務器端和客戶端在該會話上進行數據信息的交互。
使用 PuTTY 和 OpenSSH
PuTTY 是 Windows 上經典的免費 SSH 連接工具,通常用於使用 SSH 協議遠程登錄設備,最新版本可以在 PuTTY 官網下載。
OpenSSH 是 SSH 協議的開源實現,支持在 Unix 操作系統上運行,最新版本可以在 OpenSSH 官網下載。目前 Windows10 已經包含 OpenSSH 客戶端和服務器軟件,可在 “設置—應用—應用與功能—可選功能” 中搜索安裝。
SSH 密鑰
對稱加密和非對稱加密
提高安全性的基本方式就是加密,加密算法通過密鑰將明文轉換爲密文進行安全傳輸。SSH 在工作過程中結合使用了對稱加密和非對稱加密兩種類型的算法,通過事先生成的 SSH 密鑰來保證信息傳輸的安全性。兩種加密算法的加解密過程見下圖。
對稱加密算法
非對稱加密算法
對稱加密算法使用同一個密鑰對數據進行加密和解密。SSH 連接建立過程中生成的會話密鑰就是對稱密鑰,該對稱密鑰是由客戶端和服務器端基於共享的部分信息和各自的私有數據使用密鑰交換算法分別生成的。因爲對稱加密算法加解密的速度很快,所以適用於傳輸大量數據的場景。
非對稱加密的發送和接收需要使用一對關聯的 SSH 密鑰,公鑰和私鑰。私鑰由生成的一方自己保管,公鑰可以發送給任何請求通信的其他人。發送方用收到的公鑰對自己的通信內容進行加密,只有接收方可以使用私鑰進行解密獲取通信內容。非對稱加密的私鑰不需要暴露在網絡中,安全性大大增加,但是加解密的速度比對稱密鑰慢得多。
SSH 連接過程中的兩個階段使用了非對稱加密。一個是在密鑰交換階段,服務器和客戶端都生成了自己臨時的公鑰和私鑰,用於計算出同一個用於後續加密通信內容的會話密鑰。另外一個就是在用戶認證階段,利用只有匹配的私鑰可以唯一解密公鑰加密的內容這一特點,通過客戶端的公鑰私鑰對驗證客戶端的身份。
密鑰認證
SSH 用戶認證最基本的兩種方式是密碼認證和密鑰認證。密碼認證是將自己的用戶名和密碼發送給服務器進行認證,這種方式比較簡單,且每次登錄都需要輸入用戶名和密碼。密鑰認證使用公鑰私鑰對進行身份驗證,實現安全的免密登錄,是一種廣泛使用且推薦的登錄方式。密鑰認證的基本原理是服務器端使用客戶端的公鑰對隨機內容加密,客戶端使用自己的私鑰解密併發送給服務器以證實自己的身份,具體的過程見下圖。
SSH 密鑰認證登錄流程
-
在進行 SSH 連接之前,SSH 客戶端需要先生成自己的公鑰私鑰對,並將自己的公鑰存放在 SSH 服務器上。
-
SSH 客戶端發送登錄請求,SSH 服務器就會根據請求中的用戶名等信息在本地搜索客戶端的公鑰,並用這個公鑰加密一個隨機數發送給客戶端。
-
客戶端使用自己的私鑰對返回信息進行解密,併發送給服務器。
-
服務器驗證客戶端解密的信息是否正確,如果正確則認證通過。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/v18XkdeZLJjjYe4sCC_w5Q