服務器端開啟ssh服務,在端口22監聽客戶端請求
客戶端發出請求,如果是第一次與服務器建立連接,服務器端會向客戶端發送一個rsa key 而此rsa key會被記錄到服務器端的~/.ssh/known_hosts中,下次遠程登錄服務器就不會出現以上的提示信息
客戶端接收到服務器端發送過來的rsa key后,就會采用與服務器端協商好的加密算法,生成會話密鑰(此會話密鑰用于加密客戶端與服務器端之間的會話),并用rsa key加密會話密鑰,并發送給服務器端。
服務器端就用對應的私鑰解密已加密的會話密鑰,然后用此會話密鑰加密確認信息,發送給客戶端。客戶端用會話密鑰解密加密的確認信息,到此,密鑰交換成功和服務器認證成功
接下來就是客戶端的認證,客戶端認證有兩種方法:
基于口令認證:客戶端發送用會話密鑰加密的遠程登入的用戶名與密碼,服務器接收到,用會話密鑰解密,并驗證用戶名與密碼的正確性。基于密鑰認證:口令認證容易受“中間人”攻擊,而密鑰認證安全性較好,用戶名與密碼不用在網上傳輸,被人破解。客戶端生成一對密鑰,此密鑰只用于客戶端的認證,然后將公鑰內容上傳到服務器端~/.ssh/authorized_hosts文件中。客戶端發出密鑰認證請求,服務器端就會用客戶端的公鑰加密一段數據,發送給客戶端,客戶端用對應的私鑰解密,然后將數據與會話密鑰進行散列運算,生成摘要,發送給服務器端,服務器端就會用原始數據和會話密鑰,生成摘要,并對比兩個摘要是否一致,若一致,則客戶端認證成功連接成功后,就可以遠程登入主機,執行遠程命令控制
1.客戶端生成一對密鑰 2.將公鑰上傳到服務器端,這里有兩種方法上傳 一種使用ssh-keygen命令:
查看服務器端的~/.ssh/authorized_hosts文件
另一種方法,在客戶端使用scp(基于ssh協議的文件復制工具)
在服務器端的操作,查看是否成功收到客戶端公鑰
然后將公鑰文件內容導入~/.ssh/authorized_hosts文件中,如果~/.ssh/authorized_hosts(權限為600)文件不存在,就創建
3.測試
建議:客戶端認證最好用基于密鑰認證,禁止客戶端使用root身份登入主機,可以修改配置參數
在學習過程中,參考很多關于ssh原理的文章,也許每個人理解的側重點不一樣,在理解過程中,出現很多疑問,最后發現一篇文章(https://translate.google.com.hk/translate?hl=zh-TW&sl=en&u=http://www.slashroot.in/secure-shell-how-does-ssh-work&PRev=search,此網站的訪問需要翻墻)對ssh原理的解釋解決我的部分疑問,里面講解ssh1協議的工作原理,還有與ssh2的不同點,對于里面講解的ssh2,我還是有點不明白,就去谷歌很多文章,但是都無法真正理解ssh2的工作原理,大概的工作原理還是能夠理解得到,所以就總結出這篇文章。
新聞熱點
疑難解答