『壹』 SSH的工作原理
傳統的網路服務程序,比如 FTP , POP , Telnet ,本質上都是不安全的,因為它們在網路上用明文傳送數據、用戶賬號和用戶口令,很容易受到 中間人 攻擊方式的攻擊,攻擊者會冒充真正的伺服器接收用戶傳給伺服器的數據,然後再冒充用戶把數據傳給真正的伺服器。
為了滿足安全性的需求, IETF 的網路工作小組制定了 Secure Shell (縮寫為 SSH ),這是一項創建在 應用層 和 傳輸層 基礎上的安全協議,為計算機上的 Shell 提供安全的傳輸和使用環境。
SSH 是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄漏問題。通過 SSH 可以對所有傳輸的數據進行加密,也能夠防止DNS欺騙和IP欺騙。
本文將會重點討論 SSH 中用到的加密演算法和建立安全連接的過程。
為了保證信息傳輸的安全性, SSH 使用了對稱加密、非對稱加密和散列等技術。
對稱密鑰加密又稱為對稱加密、私鑰加密、共享密鑰加密,是密碼學中一類加密演算法。這類演算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單地相互推算的密鑰。
SSH 使用對稱密鑰加密整個連接過程中傳輸的信息。值得注意的是,用戶自己創建的public/private密鑰對僅僅用於驗證,不會用在加密連接上。對稱加密允許對密碼進行身份驗證,以防止第三方窺探。
共享密鑰通過密鑰交換演算法生成,它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰。客戶端和服務端都參與了這個過程,過程的細節將在後面闡述。
生成的密鑰將用來加密這次會話過程中客戶端和服務端傳輸的數據。這個過程會在驗證客戶身份之前完成。
SSH 支持多種對稱密鑰演算法,包括AES,Blowfish,3DES,CAST128和Arcfour。客戶端和服務端可以配置採用演算法的列表。客戶端列表中第一個能被服務端支持的演算法將被採用。
比如在Ubuntu 14.04上,客戶端和服務端默認的配置如下: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256 , arcfour128 , [email protected] , [email protected] , [email protected] , aes128-cbc , blowfish-cbc , cast128-cbc , aes192-cbc , aes256-cbc , arcfour 。
也就是說,如果兩台Ubuntu 14.04採用默認配置,它們總是會採用 aes128-ctr 演算法來加密連接。
在非對稱加密方法中,需要一對密鑰,一個是私鑰,一個是公鑰。這兩個密鑰數學相關。用公鑰加密後所得的信息,只能用私鑰才能解密。如果知道了其中一個,並不能計算另外一個。因此,如果公開了一對密鑰中的一個,並不會危害到另外一個的秘密性質。
SSH 在一些地方使用了非對稱加密。
在密鑰交換過程中使用到了非對稱加密。在這個階段,客戶端和服務端生成臨時密鑰對,並且交換公鑰來生成共享密鑰。
在身份驗證的過程中也使用了非對稱加密。 SSH 密鑰對用來向服務端驗證客戶端身份。客戶端創建一對密鑰,然後將公鑰上傳到遠程伺服器上,寫入文件 ~/.ssh/authorized_keys 。
在創建共享密鑰後,客戶端必須向服務端證明身份。服務端會使用文件中的公鑰加密一段信息,並將加密後的信息發送給客戶端。如果客戶端可以能夠破解這段信息,那麼就能夠證明自己擁有相關的私鑰。之後服務端會為客戶端設置shell環境。
散列是電腦科學中一種對資料的處理方法,它通過某種特定的演算法將要檢索的項與涌來檢索的索引關聯起來,生成一種便於搜索的數據結構(散列表)。它也常用做一種資訊安全的方法,由一串資料中經過散列演算法計算出來的資料指紋,來識別檔案和資料是否有被篡改。
SSH 主要使用了散列消息認證碼(Keyed-hash message authentication code,縮寫為HMAC),來確認消息沒有被篡改。
上面提到的對稱加密協商過程中,會使用消息認證碼(MAC)演算法。這個演算法會從客戶端支持的演算法中選出。
在密鑰協商完成後,所有的消息都必須攜帶MAC,用於通信雙方驗證消息的一致性。MAC值由共享密鑰,消息的分組序列和實際消息內容計算得到。
在對稱加密區域之外,MAC本身作為分組的最後部分被發送。研究者通常建議先機密數據,然後計算MAC
SSH 協議採用客戶端-服務端模型對兩方進行身份驗證,並對它們之間的數據進行加密。
服務端在指定埠監聽連接請求。它負責協商安全連接,認證連接方,並為客戶端生成正確的shell環境。
客戶端負責協商安全連接,驗證伺服器的身份是否與以前記錄的信息相匹配,並提供憑證進行身份驗證。
SSH會話分為兩個階段。第一個是同意和建立加密來保護未來的溝通。第二個階段是對用戶進行身份驗證,並發現是否應該授予對伺服器的訪問許可權。
當客戶端發起請求後,服務端返回支持的協議版本。如果客戶端可以匹配其中一個協議版本,則連接繼續。服務端會提供它的公共主機密鑰,客戶端可以用這個密鑰來驗證服務端是否合法。
此時,通信雙方採用迪菲-赫爾曼演算法來協商會話密鑰。
該演算法的大致過程如下:
用於其餘連接的共享密鑰加密被稱為二進制數據包協議。上述過程允許雙方平等地參與生成共享密鑰。
生成的密鑰是對稱密鑰,這意味著用於加密消息的密鑰也可以用於解密。其目的是將後面的通信包裝在不能被外部人員解密的加密隧道中。
在生成會話密鑰後,就開始進行用戶身份驗證。
根據伺服器接受的方式,有幾種不同的方法可用於身份驗證。
最簡單的方法是密碼驗證,其中伺服器要求客戶端輸入嘗試登陸賬號的密碼。密碼是通過協商加密發送的。
雖然密碼被加密,但由於密碼的復雜性受到限制,因此通常不建議使用此方法。與其他身份驗證的方法相比,自動腳本相對容易攻破正常長度的密碼。
最為推薦的選擇是使用SSH密鑰對。SSH密鑰對是非對稱密鑰。
公鑰用於加密只能用私鑰解密的數據。公鑰可以自由共享,因為沒有從公鑰中導出私鑰的方法。
驗證流程如下:
可以看到,密鑰的不對稱性允許服務端使用公鑰加密消息給客戶端。然後,客戶端可以通過正確解密消息來證明它擁有私鑰。
筆者本科專業是信息安全,不過畢業後並沒有從事安全行業,工作4年課堂上學習的知識基本忘的差不多了。
而SSH算是工作中最常用到的東西之一,其工作原理涉及不少密碼學的東西。
寫這篇博文,一是希望能幫助讀者了解SSH,二也是希望自己能撿起一些專業知識。在互聯網/軟體相關行業里,不論是否從事安全工作,了解這些東西都是很有必要的。
『貳』 SSH 協議原理、組成、認證方式和過程
SSH 是(Secure SHell protocol) 的簡寫,安全外殼協議(SSH)是一種在不安全網路上提供安全遠程登錄及其它安全網路服務的協議。
OpenSSH 是SSH (Secure SHell)協議的免費開源實現。SSH協議族可以用來進行遠程式控制制,或在計算機之間傳送文件。而實現此功能的傳統方式,如telnet(終端模擬協議)、 rcp ftp、 rlogin、rsh都是極為不安全的,並且會使用明文傳送密碼。OpenSSH提供了服務端後台程序和客戶端工具,用來加密遠程式控制制項和文件傳輸過程的中的數據,並由此來代替原來的類似服務。
在過去我們使用的rsh和telnet,因為包括登錄時的ID和密碼數據沒有加密就傳到網路上,存在安全上的問題。即使在內部網上,也有在網際網路上的竊取和篡改等危險性。SSH將包括密碼在內的所有數據都已進行了加密處理,可以進行更安全的遠程操作。在SSH中,由於協議標準的不同而存在SSH1和SSH2兩個不同的版本。SSH2是為了迴避SSH1所使用的加密演算法的許可證問題而開發的(現在這一許可證問題已經不存在了)。TLES 8中作為安裝SSH協議的應用程序採用了開放源碼的OpenSSH。OpenSSH與SSH1和SSH2的任何一個協議都能對應,但默認使用SSH2。
SSH 主要有三部分組成:
同時SSH協議框架中還為許多高層的網路安全應用協議提供擴展的支持。它們之間的層次關系可以用如下圖來表示:
對於SSH這樣以提供安全通訊為目標的協議,其中必不可少的就是一套完備的密鑰機制。由於SSH協議是面向互聯網網路中主機之間的互訪與信息交換,所以主機密鑰成為基本的密鑰機制。也就是說,SSH協議要求每一個使用本協議的主機都必須至少有一個自己的主機密鑰對,服務方通過對客戶方主機密鑰的認證之後,才能允許其連接請求。一個主機可以使用多個密鑰,針對不同的密鑰演算法而擁有不同的密鑰,但是至少有一種是必備的,即通過 DSS演算法產生的密鑰。關於DSS演算法,請參考 FIPS-186 文檔.SSH協議關於主機密鑰認證的管理方案有兩種,如下圖所示:
每一個主機都必須有自己的主機密鑰,密鑰可以有多對,每一對主機密鑰對包括公開密鑰和私有密鑰。在實際應用過程中怎樣使用這些密鑰,並依賴它們來實現安全特性呢?如上圖所示,SSH協議框架中提出了兩種方案。
在第一種方案中,主機將自己的公用密鑰分發給相關的客戶機,客戶機在訪問主機時則使用該主機的公開密鑰來加密數據,主機則使用自己的私有密鑰來解密數據,從而實現主機密鑰認證,確定客戶機的可靠身份。在圖2(a)中可以看到,用戶從主機A上發起操作,去訪問,主機B和主機C,此時,A成為客戶機,它必須事先配置主機B和主機C的公開密鑰,在訪問的時候根據主機名來查找相應的公開密鑰。對於被訪問主機(也就是伺服器端)來說則只要保證安全地存儲自己的私有密鑰就可以了。
在第二種方案中,存在一個密鑰認證中心,所有系統中提供服務的主機都將自己的公開密鑰提交給認證中心,而任何作為客戶機的主機則只要保存一份認證中心的公開密鑰就可以了。在這種模式下,客戶機在訪問伺服器主機之前,還必須向密鑰認證中心請求認證,認證之後才能夠正確地連接到目的主機上。
很顯然,第一種方式比較容易實現,但是客戶機關於密鑰的維護卻是個麻煩事,因為每次變更都必須在客戶機上有所體現;第二種方式比較完美地解決管理維護問題,然而這樣的模式對認證中心的要求很高,在互聯網路上要實現這樣的集中認證,單單是權威機構的確定就是個大麻煩,有誰能夠什麼都能說了算呢?但是從長遠的發展來看,在企業應用和商業應用領域,採用中心認證的方案是必要的。
另外,SSH協議框架中還允許對主機密鑰的一個折中處理,那就是首次訪問免認證。首次訪問免認證是指,在某客戶機第一次訪問主機時,主機不檢查主機密鑰,而向該客戶都發放一個公開密鑰的拷貝,這樣在以後的訪問中則必須使用該密鑰,否則會被認為非法而拒絕其訪問。
在整個通訊過程中,為實現 SSH的安全連接,伺服器端與客戶端要經歷如下五個階段:
* 版本號協商階段,SSH目前包括 SSH1和SSH2兩個版本, 雙方通過版本協商確定使用的版本
* 密鑰和演算法協商階段,SSH支持多種加密演算法, 雙方根據本端和對端支持的演算法,協商出最終使用的演算法
* 認證階段,SSH客戶端向伺服器端發起認證請求, 伺服器端對客戶端進行認證
* 會話請求階段, 認證通過後,客戶端向伺服器端發送會話請求
* 交互會話階段 ,會話請求通過後,伺服器端和客戶端進行信息的交互
Q1: SSH的版本和區別。
SSH2避免了RSA的專利問題,並修補了CRC的缺陷。SSH2用數字簽名演算法(DSA)和Diffie-Hellman(DH)演算法代替RSA來完成對稱密鑰的交換,用HMAC來代替CRC。同時SSH2增加了AES和Twofish等對稱加密演算法。
A1: SSH(Secure SHell)到目前為止有兩個不兼容的版本——SSH1和SSH2。SSH1又分為1.3和1.5兩個版本。SSH1採用DES、3DES、 Blowfish和RC4等對稱加密演算法保護數據安全傳輸,而對稱加密演算法的密鑰是通過非對稱加密演算法(RSA)來完成交換的。SSH1使用循環冗餘校驗碼(CRC)來保證數據的完整性,但是後來發現這種方法有缺陷。
更多內容請參考The SSHv1 Protocol & The SSHv2 Protocol
Q2: 什麼是HMAC?
A2: HMAC(Hash Message Authentication Code) ,散列消息鑒別碼,基於密鑰的Hash演算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。
Q3: 什麼是X11 forwarding?
A3: sh的X11 forwarding特性可以使X client和X server安全地通訊。使用X11 forwarding後,從X client到X Server方向的數據先被送至ssh server,ssh server利用和ssh client的安全通道轉發給ssh client,再由ssh client轉發給X server,從X server到X client的數據流同理。這里ssh server和ssh client充當了X client和X server間數據的轉發器,由於ssh server和X client、ssh client和X server一般在同一台機器上,它們之間是一種安全的進程間通訊,而ssh server和ssh client間的通訊也是安全的,所以X client和X server間的通訊就是安全的。
Q4: 什麼是TTY?
A4: 終端是一種字元型設備,它有多種類型,通常使用tty來簡稱各種類型的終端設備。tty是 Teletype的縮寫。Teletype是最早出現的一種終端設備,很象電傳打字機,是由Teletype公司生產的。設備名放在特殊文件目錄/dev/下。
Q5: 簡單描述下SSH運行的過程?
『叄』 非對稱加密、SSH加密演算法、數字簽名簡介
非對稱加密演算法的核心源於數學問題,它存在公鑰和私鑰的概念,要完成加解密操作,需要兩個密鑰同時參與。我們常說的「公鑰加密,私鑰加密」或「私鑰加密, 公鑰解密」都屬於非對稱加密的范疇。公鑰加密的數據必須使用私鑰才可以解密,同樣,私鑰加密的數據也 只能通過公鑰進行解密。
相比對稱加密,非對稱加密的安全性得到了提升,但是也存在明顯的缺點,非對稱加解密的效率要遠遠小於對稱加解密。所以非對稱加密往往被用在一些安全性要求比較高的應用或領域中。
RSA加密演算法是一種典型的非對稱加密演算法,它基於大數的因式分解數學難題,它也是應用最廣泛的非對稱加密演算法,於1978年由美國麻省理工學院(MIT)的三位學者:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
它的原理較為簡單,我們假設有消息發送方A和消息接收方B,通過下面的幾個步驟,我們就可以完成消息的加密傳遞:
(1)消息發送方A在本地構建密鑰對,公鑰和私鑰;
(2)消息發送方A將產生的公鑰發送給消息接收方B;
(3)B向A發送數據時,通過公鑰進行加密,A接收到數據後通過私鑰進行解密,完成一次通信;
(4)反之,A向B發送數據時,通過私鑰對數據進行加密,B接收到數據後通過公鑰進行解密。
由於公鑰是消息發送方A暴露給消息接收方B的,所以這種方式也存在一定的安全隱患,如果公鑰在數據傳輸過程中泄漏,則A通過私鑰加密的數據就可能被解密。
如果要建立更安全的加密消息傳遞模型,需要消息發送方和消息接收方各構建一套密鑰對,並分別將各自的公鑰暴露給對方,在進行消息傳遞時,A通過B的公鑰對數據加密,B接收到消息通過B的私鑰進行解密,反之,B通過A的公鑰進行加密,A接收到消息後通過A的私鑰進行解密。
當然,這種方式可能存在數據傳遞被模擬的隱患,我們可以通過數字簽名等技術進行安全性的進一步提升。由於存在多次的非對稱加解密,這種方式帶來的效率問題也更加嚴重。可以詳讀這兩篇文章:RSA 演算法原理 (一) (二)
在SSH安全協議的原理中, 是一種非對稱加密與對稱加密演算法的結合,先看下圖:
這里進行一下說明:
(1)首先服務端會通過非對稱加密,產生一個 公鑰 和 私鑰
(2)在客戶端發起請求時,服務端將 公鑰 暴露給客戶端,這個 公鑰 可以被任意暴露;
(3)客戶端在獲取 公鑰 後,會先產生一個由256位隨機數字組成的會話密鑰,這里稱為口令;
(4)客戶端通過 公鑰 將這個口令加密,發送給伺服器端;
(5)伺服器端通過 私鑰 進行解密,獲取到通訊口令;
之後,客戶端和服務端的信息傳遞,都通過這個口令進行對稱的加密。
這樣的設計在一定程度上提高了加解密的效率,不過,與客戶端服務端各構建一套密鑰對的加解密方式相比,在安全性上可能有所下降。在上面所述的通過口令進行加密的過程中,數據也是可以被竊聽的,不過由於密鑰是256個隨機數字,有10的256次方中組合方式,所以破解難度也很大。相對還是比較安全的。服務端和客戶端都提前知道了密鑰,SSH的這種方式,服務端是通過解密獲取到了密鑰。
現在知道了有非對稱加密這東西,那數字簽名是怎麼回事呢?
數字簽名的作用是我對某一份數據打個標記,表示我認可了這份數據(簽了個名),然後我發送給其他人,其他人可以知道這份數據是經過我認證的,數據沒有被篡改過。
有了上述非對稱加密演算法,就可以實現這個需求:
『肆』 SSH隧道協議(AES密鑰對加密法則)
SSH是每一台Linux電腦的標准配置
隨著Linux設備從電腦逐漸擴展到手機、外設和家用電器,SSH的適用范圍也越來越廣。不僅程序員離不開它,很多普通用戶也每天使用;SSH具備多種功能,可以用於很多場合。有些事情,沒有它就是辦不成
簡單說,SSH是一種網路協議,用於計算機之間的加密登錄。
如果一個用戶從本地計算機,使用SSH協議登錄另一台遠程計算機,我們就可以認為,這種登錄是安全的,即使被中途截獲,密碼也不會泄露。
最早的時候,互聯網通信都是明文通信,一旦被截獲,內容就暴露無疑。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登錄信息全部加密,成為互聯網安全的一個基本解決方案,迅速在全世界獲得推廣,目前已經成為Linux系統的標准配置。雹和陵
需要指出的是,SSH只是一種協議,存在多種實現,既有商業實現,也有開源實現。
SSH主要用於遠程登錄。假定你要以用戶名user,登錄遠程主機host,只要一條簡單命令就可以了。
如果本地用戶名與遠程用戶名一致,登錄時可以省略用戶名。
SSH的默認埠是22,也就是說,你的登錄請求會送進遠程主機的22埠。使用p參數,可以修改這個埠。
上面這條命令表示,ssh直接連接遠程主機的2222埠。
SSH之所以能夠保證安全,原因在於它採用了公鑰加密。
整個過程是這樣的:(1)遠程主機收到用戶的登錄請求,把自己的公鑰發給用戶。(2)用戶使用這個公鑰,將登錄密碼加密後,發送回來。(3)遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。
這個過程本身是安全的,但是實施的時候存在一個風險:如果有人截獲了登錄請求,然後冒充遠程主機,將偽造的公鑰發給用戶,那麼用戶很難辨別真偽。因為不像https協議,SSH協議的公鑰是沒有證書中心棚褲(CA)公證的,也就是說,都是自己簽發的。
可以設想,如果攻擊者插在用戶與遠程主機之間(比如在公共的wifi區域),用偽造的公鑰,獲取用戶的登錄密碼。再用這個密碼登錄遠程主機,那麼SSH的安全機制就盪然無存了。這種風險就是著名的「中間人攻擊」(Man-in-the-middle attack)。
SSH協議是如何應對的呢?
如果你是第一次登錄對方主機,系統會出現下面的提示:
這段話的意思是,無法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續連接嗎?
所謂」公鑰指紋」,是指公鑰長度較長(這里採用RSA演算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再進行比較,就容易多了。
很自然的一個問題就是,用戶怎麼知道遠程主機的公鑰指紋應該是多少?回答是沒有好辦法,遠程主機必須在自己的網站上貼出公鑰指紋,以便用戶自行核對。
假定經過風險衡量以後,用戶決定接受這個遠程主機的公鑰。
系統會出現一句提示,表示host主機已經得到認可。
然後,會要求輸入密碼。
如果密碼正確,就可以登錄了。
當遠程主機的公鑰被接受以後,它就會被保存在文件 $HOME/.ssh/known_hosts 之中。下次再連接這台主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。
每個SSH用戶都有自己的 known_hosts 文件,此外系統也有一個這樣的文件,通常是 /etc/ssh/ssh_known_hosts ,保存一些對所有用戶都可信賴的遠程主機的公鑰。
使用密碼登錄,每次都必須輸入密碼,非常麻煩。好在SSH還提供了公鑰登錄,可以省去輸入密碼的步驟。
所謂」公鑰登錄」,原理很簡單,就是用戶將自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發送一段隨機字元串,用戶用自己的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。
這種方法要求用戶必須提供自己的公鑰。如果沒有現成的源戚,可以直接用 ssh-keygen 生成一個:
運行上面的命令以後,系統會出現一系列提示,可以一路回車。其中有一個問題是,要不要對私鑰設置口令(passphrase),如果擔心私鑰的安全,這里可以設置一個。
運行結束以後,在$HOME/.ssh/目錄下,會新生成兩個文件: id_rsa.pub 和 id_rsa 。前者是你的公鑰,後者是你的私鑰。
這時再輸入下面的命令,將公鑰傳送到遠程主機host上面:
好了,從此你再登錄,就不需要輸入密碼了。
如果還是不行,就打開遠程主機的 /etc/ssh/sshd_config 這個文件,檢查下面幾行前面」#」注釋是否取掉。
然後,重啟遠程主機的ssh服務。
遠程主機將用戶的公鑰,保存在登錄後的用戶主目錄的 $HOME/.ssh/authorized_keys 文件中。公鑰就是一段字元串,只要把它追加在 authorized_keys 文件的末尾就行了。
這里不使用上面的ssh--id命令,改用下面的命令,解釋公鑰的保存過程:
這條命令由多個語句組成,依次分解開來看:
(1) 」$ ssh user@host」 ,表示登錄遠程主機;
(2)單引號中的 mkdir .ssh && cat >> .ssh/authorized_keys ,表示登錄後在遠程shell上執行的命令:
(3) 」$ mkdir -p .ssh」 的作用是,如果用戶主目錄中的.ssh目錄不存在,就創建一個;
(4) 』cat >> .ssh/authorized_keys』 < ~/.ssh/id_rsa.pub 的作用是,將本地的公鑰文件 ~/.ssh/id_rsa.pub ,重定向追加到遠程文件 authorized_keys 的末尾。
寫入 authorized_keys 文件後,公鑰登錄的設置就完成了。
『伍』 ssh使用詳解
簡單來說,ssh是一種 網路協議 ,用於計算機之間的加密登錄。如果一個用戶從本地計算機,使用ssh協議登錄另一台遠程計算機,我們就可以認為,這種登錄是安全的,即使被中途截獲,密碼也不會泄露。
SSH 之所以安全是採用了公鑰加密的方式,通過客戶自己簽發公鑰加密用戶密碼,再通過主機持有的私鑰解密;不像 HTTPS 協議存在證書管理中心CA用於驗證公鑰的合法性,因此,存在被中間人劫持的風險,即劫持登錄請求發送篡改的公鑰來截獲用戶登錄密碼,俗稱」中間人攻擊「;
不過 SSH 存在一套自有的驗證方式:口令驗證及密鑰驗證,可有效避免大部分的攻擊;
使用上述命令測試連接性及驗證流程;
通過 ssh-keygen 工具生成本地公鑰文件,常用命令如下:
在 $HOME/.ssh/ 目錄下,會新生成兩個文件: id_rsa.pub 和 id_rsa 。 id_rsa.pub 是公鑰, id_rsa 是私鑰,其中 id_rsa 為默認文件名稱,若如上圖指定了文件路徑及名稱,則按照指定路徑及文件名生成;
說明:若 ssh 登錄使用密鑰驗證方式登錄,則需要輸入私鑰的密碼(生成密鑰時指定的密碼),若使用 ssh-agent 代理,則在同一個 session 會話下,只需要輸入一次私鑰密碼即可,由 ssh-agent 幫我們代理,避免每次登錄都需要輸入私密碼;
若登錄時未開啟,可手動開啟 ssh-agent ,可通過如下命令:
添加生成的 SSH key 到 ssh-agent :
查看添加的 SSH key :
若需要免密登錄,則需要將用戶的 public key 文件內存追加復制到登錄主機的 authorized_keys 配置文件中(默認路徑為 ~/.ssh/authorized_keys ),或者直接通過 ssh--id 工具完成,具體如下:
使用上述命令後即可實現 免密登錄 ;
ssh 配置包括系統級別的(針對客戶端的默認為 /etc/ssh/ssh_config ,針對服務端的``/etc/ssh/sshd_config )及用戶級別的配置文件(默認為 ~/.ssh/config`);且配置文件存在優先順序,低優先順序的配置項可視作默認值;而高優先順序的配置項則會覆蓋默認值。按優先順序,有如下排序:
/etc/ssh/config 配置文件選項如下:
/etc/ssh/sshd_config 配置文件選項如下:
常用的選項如下:
ssh -T [email protected] 驗證連接性,成功如下:
ssh配置文件詳解
git-ssh 配置和使用
ssh-keygen - Generate a New SSH Key
最佳搭檔:利用 SSH 及其配置文件節省你的生命