這看起來太簡單了,我覺得我可能錯過了一些顯而易見的事情,但是當您使用 SSH 而不產生金鑰對時,實際發生了什麼?
已提出此問題的變體這裡就像答案一樣,我一直明白,如果沒有金鑰對,SSH 就會退回到密碼驗證。
但是,那維基百科文章僅描述了兩種使用方法。兩者似乎都涉及密鑰對,一對是手動生成的,一對是自動生成的。
使用 SSH 有多種方法;一種是使用自動產生的公私密鑰對簡單加密網路連接,然後使用密碼驗證登入。
另一種是使用手動產生的公私鑰對來執行身份驗證,允許使用者或程式無需指定密碼即可登入
當我在沒有金鑰對的情況下建立與不安全伺服器的 SSH 連線時,系統會提示我輸入使用者名稱和密碼,然後我就可以存取 shell。
密碼後備是否是實作細節,因此不在 wiki 中?是否按照建議自動產生了密鑰對(如果是,公鑰是如何到達伺服器的)?還是僅透過密碼進行。
如果僅使用密碼和使用者名稱組合,資料是否已加密?如果是這樣,它是如何加密的?
答案1
維基百科文章混淆了不同的 SSHv2 層。 (這可能是有些十年前的 SSHv1 是正確的,但它絕對被簡化到了無意義的程度。
您和伺服器的 SSHv2 金鑰對用於驗證僅有的,並且加密設定始終使用為每個連接臨時產生的 DH 金鑰對來完成。僅伺服器的 SSH 金鑰對跡象加密設定資料(以證明伺服器的身份),而客戶端的 SSH 金鑰對根本不用於此過程。
在 SSHv2 中,當您連接到伺服器時(在兩端交換支援的演算法列表之後),第一步是密鑰交換,它以某種方式產生用於加密整個連接的對稱金鑰。 (作為此過程的副作用,伺服器也會進行身份驗證。)
用戶端產生 DH 金鑰對(僅用於此連線)並發送其 DH 公鑰。
伺服器也會產生新的 DH 金鑰對。它還從磁碟加載其 SSH“主機金鑰”金鑰對。
然後它跡象DH 公鑰和 SSH 私鑰,並將兩個公鑰(以及簽章)傳送給用戶端。
用戶端檢查簽名並驗證伺服器的 SSH 公鑰是否在known_hosts中。
然後它同時使用DH金鑰(客戶端的私鑰 + 伺服器的公鑰)來產生共用加密金鑰,並丟棄其 DH 金鑰對。
伺服器也使用兩個 DH 金鑰(伺服器的私有金鑰 + 用戶端的公用金鑰)來產生相同的共用加密金鑰,並丟棄其 DH 金鑰對。
雙方均啟用加密。
(還有一些其他密鑰交換方法,但很少使用。)
下一步是客戶端認證。請注意,此時連線已加密,即使客戶端的 SSH 金鑰尚未使用!
客戶端發送“服務請求”以進行客戶端身份驗證。
伺服器提供一些機制——“密碼”、“公鑰”,可能還有其他機制。
如果您有 SSH 金鑰對,則用戶端選擇“公鑰”,發送您的 SSH 公鑰,並使用您的 SSH 私鑰對伺服器提供的一些隨機資料進行簽名,以證明金鑰所有權。
如果您沒有 SSH 金鑰對,用戶端會選擇「密碼」並直接發送您的密碼 - 但仍在加密隧道內。