ssh的加密過程
㈠ ssh和telnet區別
telnet是明文傳輸,而ssh是加密傳輸,相對來說比較安全。 1.ssh機制第一種是路由器公鑰加密,私鑰解密。ssh路由器會產生一個公鑰public,一個私鑰pri.當客戶端通過ssh登錄到設備的時候,路由器會將自己的公鑰發送給客戶端,客戶端接受並保存這個公鑰,接下來的過程就是加密,客戶端輸入用戶名和密碼的過程是通過路由器的公鑰來加密的,客戶端輸入完成將這個在發送給路由器,路由器通過自己的私鑰來解密這個公鑰。再將這個用戶名和密碼發送到本地進行認證。認證成功,整個登錄即ok。 2.ssh機制第二種是路由器產生一個公鑰秘鑰,客戶端也產生一個公鑰秘鑰。當客戶端試圖登錄路由器,客戶端輸入正確的用戶名admin後,路由器發現admin用戶被綁定到名稱為AR1的rsa秘鑰。所以路由器會將此公鑰發送給客戶端進行驗證,因為客戶端有對應的私鑰可以解密公鑰,故認證成功。難點:客戶端的公鑰如何產生,客戶端的公鑰如何導入路由器。路由器的公鑰如何產生,路由器的公鑰如何導入客戶端。㈡ 【linux】SSH 使用密碼/公鑰遠程登錄總結
本文是筆者查閱網上資料做的總結,關於SSH原理,什麼是對稱加密和非對稱加密,本文不過多介紹。這里介紹一下SHH的工作過程、配製方法,可能出現的問題及解決方法。
說明:本文中涉及的例子,SSH客戶端為:本地主機A,SSH伺服器為:伺服器B
SSH協議採用C-S(客戶端-伺服器端)架構進行雙方的身份驗證以及數據的加密。
伺服器端組件監聽指定的埠,負責安全連接的建立、對連接方的身份認證、以及為通過身份認證的用戶建立正確的環境。
客戶端負責發起最初的TCP握手、安全連接的建立、驗證伺服器的身份與之前記錄中的一致、並將自己的驗證信息提供給伺服器。
一個SSH會話的建立過程分為兩個階段。第一階段,雙方溝通並同意建立一個加密連接通道以供後續信息傳輸用。第二階段,對請求接入的用戶進行身份驗證以確定伺服器端是否要給該用戶開放訪問許可權。
當客戶端發起TCP連接時,伺服器端返回信息說明自己支持的協議版本,如果客戶端上支持的協議與之匹配,則連接繼續。伺服器會提供自己的公共主機密鑰(public host key)以讓客戶端確認自己訪問的是正確的機器。
然後,雙方採用一種Diffie-Hellman演算法共同為該會話建立密鑰。每一方的一部分私有數據,加上來自對方的一部分公共數據,通過這種演算法計算,能夠得出完全相同的密鑰用於本次會話。
整個會話的通訊內容都使用該密鑰進行加密。這個階段使用的公鑰/私鑰對與用戶驗證身份用的SSH密鑰是完全無關的。
經典Diffie-Hellman演算法的計算步驟如下:
這個共享密鑰的加密方式被稱為二進制數據包協議(binary packet protocol)。該過程能夠讓雙方平等的參與密鑰生成的過程,而不是由單方掌握。這種共享密鑰生成的過程是安全的,雙方沒有交換過任何未經加密的信息。
生成的密鑰是對稱式密鑰,一方用於加密信息的密鑰等同於另一方用於解密信息的密鑰,而任何第三方由於不持有該密鑰,是無法解密雙方傳遞的內容的。
會話加密通道建立後,SSH開始進入用戶認證階段。
下一步,伺服器驗證用戶身份以決定是否准許其訪問。驗證有不同的方式,選擇的驗證方式取決於伺服器的支持。
最簡單的驗證是密碼驗證:伺服器要求客戶端輸入密碼,客戶端輸入的密碼經過上述的通道加密傳輸給伺服器。
雖然密碼是加密過的,然而該方法仍然不被推薦,因為用戶經常為了省事而使用過於簡單的密碼,而這類密碼很容易就能夠被自動化腳本破解。
最流行的驗證方式是SSH密鑰對,這也是當前最推薦的方式。SSH密鑰對是非對稱密鑰,私鑰和公鑰分別用於不同的功能。
公鑰用於加密,而私鑰用於解密。公鑰可以隨意上傳、共享,因為公鑰的流通並不會危及到私鑰的保密性。
SSH密鑰對的驗證過程起始於上一部分加密通道建立之後,其具體執行步驟如下:
簡單來說,伺服器端用公鑰加密信息,客戶端用私鑰解密信息以證明自己持有私鑰。該過程同時使用了對稱加密和非對稱加密,兩種方式各有自己的功用。
命令如下:
用戶名:為要登錄的伺服器B中已存在的用戶賬戶名
IP地址:為伺服器B的IP地址
-p 埠號:用來指定埠號,默認為22
第一次登錄時,會提示如下提示:
大概意思是說,你正在訪問的主機不能驗證它的真實性,它的RSA key(當前訪問主機的公鑰)指紋是怎樣的,你確定要繼續連接嗎?
輸入yes繼續,會提示,已永久把當前訪問主機的RSA key添加到了已知主機文件(用戶目錄下,.ssh 文件夾中的knwon_hosts文件)中。之後再次 SSH 登錄就不再有該提示了。
接著,輸入登錄賬戶的密碼即可。
SSH 密碼登錄,需要伺服器開啟密碼驗證許可權,編輯伺服器SSH配置命令如下:
在 sshd_config 文件中,Protocol 2 下面 #PasswordAuthentication yes,將前面的#號去掉,保存退出。
公鑰登錄,即免密碼登錄。避免的每次登錄都要輸入的麻煩,也防止了中間人攻擊。是SSH遠程登錄最常用的登錄方式。
提示輸入密鑰對名稱,直接回車,使用默認名稱即可;
提示輸入密碼(使用私鑰時,要輸入密碼),直接回車,不使用密碼即可。
首先,登錄伺服器B,在進行下面的操作。
找到 #PubkeyAuthentication yes,刪除 #號,保存退出。
重啟 ssh 服務
也可指定驗證私鑰:
本地主機A,生成密鑰對後:
sudo vim /etc/selinux/config
㈢ 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詳解-3.密鑰登陸
SSH詳解-1.ssh基礎知識
SSH詳解-2.ssh基本用法
SSH詳解-3.密鑰登陸
SSH詳解-4.多個ssh公鑰
在上一篇中我們了解到了ssh基本用法,ssh通過密碼進行登錄。密碼登錄存在很多問題。密碼太簡單,又不安全。密碼太復雜,不容易記,而且每次登錄都要輸入很麻煩。於是就有了密鑰登陸。
什麼是密鑰(key)?
ssh密鑰登錄採用的是 非對稱加密 。
非對稱密鑰加密系統,又稱公鑰密鑰加密。它需要使用不同的密鑰來分別完成加密和解密操作,一個公開發布,即公開密鑰(public key)和,另一個由用戶自己秘密保存,即私用密鑰(private key)。
如果數據使用公鑰加密,那麼只有使用對應的私鑰才能解密,其他密鑰都不行;反過來,如果使用私鑰加密(這個過程一般稱為「簽名」),也只有使用對應的公鑰解密。
了解完密鑰後,接下來看看密鑰登錄的過程,SSH 密鑰登錄分為以下的步驟。
第零步,准備步驟客戶端通過 ssh-keygen 生成自己的公鑰和私鑰,並將公鑰放入遠程伺服器的指定位置。
第一步,用戶客戶端向伺服器發起SSH登錄的請求。
第二步,伺服器收到用戶SSH登錄的請求,伺服器生成一些隨機數據發送給客戶端。
第三步,客戶端接收到伺服器發過來的數據,客戶端使用私鑰對數據進行簽名後再返回給伺服器。
第四步,伺服器收到客戶端加密後的數據,使用對應公鑰進行解密。然後判斷解密後的數據是否與原始數據一致,如果一致就允許用戶登錄。
ssh-keygen 是OpenSSH提供的一個命令行工具,用於生成密鑰登錄所需的公鑰和私鑰。
在上面的例子中,我使用了-t參數來指定加密演算法,一遍會選擇rsa或者dsa。
第一個問題,問我要保存在哪?(直接Enter默認會保存在~/.ssh/id_rsa中)因為我之前已經生成過密鑰了,我就保存在tenxun裡面。
第二個問題,詢問是否要為私鑰文件設定密碼保護(passphrase)。這樣的話,即使入侵者拿到私鑰,還是需要破解密碼。如果為了方便,不想設定密碼保護,可以直接按回車鍵,密碼就會為空。
最後,就會生成私鑰和公鑰,屏幕上還會給出公鑰的指紋,以及當前的用戶名和主機名作為注釋,用來識別密鑰的來源。
從上面的公鑰中我們可以看到末尾的公鑰注釋 23696@DESKTOP-GKRBCVI
公鑰注釋可以用來識別不同的公鑰,表示這是哪台主機(DESKTOP-GKRBCVI)的哪個用戶(username)的公鑰。
注意 ,公鑰只有一行。因為它太長了,顯示的時候可能自動換行了。
OpenSSH 規定,用戶公鑰保存在伺服器的 ~/.ssh/authorized_keys 文件。你要以哪個用戶的身份登錄到伺服器,密鑰就必須保存在該用戶主目錄的~/.ssh/authorized_keys文件。只要把公鑰添加到這個文件之中,就相當於公鑰上傳到伺服器了。每個公鑰占據一行。如果該文件不存在,可以手動創建。
-i 指定要上傳公鑰(公鑰文件可以不指定路徑和 .pub 後綴名),user是所要登錄的用戶名,hostname是主機名,這兩個參數與ssh 登錄命令是一致。
特別注意 ,不是把公鑰上傳上去就行了,還需要把 authorized_keys 文件的許可權要設為644,即只有文件所有者才能寫。如果許可權設置不對,SSH伺服器可能會拒絕讀取該文件,導緻密鑰登錄失效,登錄的時候還需要輸入密碼。
提到輸入密碼,如果再生成公鑰和私鑰的時候設置了密碼,使用密鑰登錄的時候也需要輸入私鑰的密碼,這樣可以防止他人非法竊取了私鑰。
私鑰設置了密碼以後,每次使用都必須輸入私鑰密碼,這個問題可以使用 ssh-agent 命令解決。
網路-密鑰
Git - 生成 SSH 公鑰 (git-scm.com)
ssh(1) - OpenBSD manual pages