做爲開發者,所開發的每個應用在成型後都須要部署,雖然咱們使用着各式各樣的部署工具,可是其背後最本質的東西徹底同樣,即是如何與服務器交互,而交互的第一步便涉及到登陸。算法
一. 認識sshshell
SSH(Secure Shell),譯作「安全shell」,如何作到安全?即是經過加密算法將須要傳輸的數據進行處理後,經過TCP傳輸,在兩端之間經過密文交互達到安全目的,因此它的本質即數據的加密。數據庫
SSH在目前一共有兩個不兼容的版本,區別在於各自採用的加密方式不相同。SSH1使用了在加密對稱加密祕鑰的時候使用了非對稱加密算法(RSA), 使用了循環冗餘校驗碼(CRC)來保證傳輸數據的完整。SSH2則使用了新的對稱加密算法和替代RSA加密祕鑰的算法,而且使用散列值(HMAC)算法替代CRC來保證傳輸數據的完整。vim
二. SSH認證安全
SSH的用戶認證方式有兩種,第一種是帳戶密碼登陸,即你須要鏈接的遠程服務器某一個用戶與密碼,比較經常使用,也比較簡單。第二種是公鑰驗證受權登陸,這一種認證較爲複雜,可是配置好後其後續操做將十分便捷,本次也主要梳理該種認證方式原理及其流程。bash
三. 免密登陸服務器
1. 免密本質ssh
若是將輸入密碼登陸比做拿鑰匙開門,那麼免密登陸能夠理解爲刷臉或者刷指紋開門,而刷臉和錄指紋的操做即是你在此以前已經在開門認證的可信任數據庫中錄下來,在錄下來以後才體會到開門不用鑰匙便捷。因此,免密登陸的前提就是遠端的服務器可以認識你的機器,而你的機器「刷臉」(免密)進門就須要把它的「臉」(公鑰)放到遠端的服務器的可信列表裏。工具
2. 實現ui
a. 生成公私鑰
# 生成祕鑰
ssh-keygen -t rsa -C 「your_email@gmail.com」複製代碼
b. 將本地的公鑰上傳至遠程服務器的用戶信任列表
# 將公鑰id_rsa.pub同步至服務器(10.11.xx.xx)地址的user用戶下
ssh-copy-id -i ~/.ssh/id_rsa.pub user@10.11.xx.xx複製代碼
c. 檢查遠程服務器可信任列表
cd ~/.ssh/
# 查看可信任公鑰列表裏,存在你的公鑰
cat authorized_keys複製代碼
d. 免密驗證
ssh user@10.11.xx.xx複製代碼
e. 別名配置
因爲ip是一段無序的數字,要是不記在內心,則須要每次登錄服務器都翻筆記找對應ip,是比較費勁的,這時候能夠給它起一個好記的別名,好比你的服務器在美國,能夠叫usa_server,當你連接它的時候直接ssh別名就能夠了,僅須要在你本地簡單配置一下便可。
# 進入.ssh
cd ~/.ssh/
# 新建config
vim config
# 添加如下內容
Host usa_server
HostName 10.11.xx.xx
User user
Port 22
# 保存
# ssh別名連接驗證
ssh usa_server複製代碼
四. 認證原理
1.輸入密碼(口令)驗證
用戶在客戶端ssh遠程服務器,遠程服務器將本身的公用密鑰下發至客戶端的~/.ssh/known_hosts,客戶端將使用該公開密鑰來加密數據,遠程服務器使用本身的私有密鑰來解密數據,從而實現加密訪問過程。
2. 免密登陸(祕鑰)驗證
首先在客戶端建立一對密匙,ssh-copy-id把公鑰放在遠程服務器的可信任列表中cd ~/.ssh/authorized_keys。
當客戶端SSH鏈接服務器時,客戶端攜帶着公鑰向服務器發出連接請求,遠端服務器收到請求後,在 ~/.ssh/authorized_keys信任文件裏比對該公鑰是否存在,若是對比成功,遠端服務器則使用該公鑰加密一個隨機字符串(challenge),而後發送給客戶端。客戶端接收到該服務器回來的請求後,將隨機字符串(challenge)用本身的私鑰進行解密,以後再將解密後的結果傳給遠端服務器,遠端服務器對比傳來的字符串是否一致,一致則創建鏈接。
3. 兩種方式簡單比較
從原理層面上就可看出,第一種驗證方式相比於第二種的步驟稍微簡單一些,即表明第一種在鏈接時更快一些。可是第二種方式則更加安全一些,由於第一種方式並不能徹底保證你所鏈接的機器就是你想鏈接的機器,存在「中間人攻擊」的風險。
如上內容均爲本身總結,不免會有錯誤或者認識誤差,若有問題,但願你們留言指正,以避免誤人,如有什麼問題請留言,會盡力回答之。若是對你有幫助不要忘了分享給你的朋友或者點擊右下方的「在看」哦!也能夠關注做者,查看歷史文章而且關注最新動態,助你早日成爲一名全棧工程師!