當您使用 SSH 而不產生金鑰對時,到底會發生什麼?

當您使用 SSH 而不產生金鑰對時,到底會發生什麼?

這看起來太簡單了,我覺得我可能錯過了一些顯而易見的事情,但是當您使用 SSH 而不產生金鑰對時,實際發生了什麼?

已提出此問題的變體這裡就像答案一樣,我一直明白,如果沒有金鑰對,SSH 就會退回到密碼驗證。

但是,那維基百科文章僅描述了兩種使用方法。兩者似乎都涉及密鑰對,一對是手動生成的,一對是自動生成的。

使用 SSH 有多種方法;一種是使用自動產生的公私密鑰對簡單加密網路連接,然後使用密碼驗證登入。

另一種是使用手動產生的公私鑰對來執行身份驗證,允許使用者或程式無需指定密碼即可登入

當我在沒有金鑰對的情況下建立與不安全伺服器的 SSH 連線時,系統會提示我輸入使用者名稱和密碼,然後我就可以存取 shell。

密碼後備是否是實作細節,因此不在 wiki 中?是否按照建議自動產生了密鑰對(如果是,公鑰是如何到達伺服器的)?還是僅透過密碼進行。

如果僅使用密碼和使用者名稱組合,資料是否已加密?如果是這樣,它是如何加密的?

答案1

維基百科文章混淆了不同的 SSHv2 層。 (這可能是有些十年前的 SSHv1 是正確的,但它絕對被簡化到了無意義的程度。

您和伺服器的 SSHv2 金鑰對用於驗證僅有的,並且加密設定始終使用為每個連接臨時產生的 DH 金鑰對來完成。僅伺服器的 SSH 金鑰對跡象加密設定資料(以證明伺服器的身份),而客戶端的 SSH 金鑰對根本不用於此過程。


在 SSHv2 中,當您連接到伺服器時(在兩端交換支援的演算法列表之後),第一步是密鑰交換,它以某種方式產生用於加密整個連接的對稱金鑰。 (作為此過程的副作用,伺服器也會進行身份驗證。)

大多數時候D-H或者ECDH將用於此,這意味著:

  1. 用戶端產生 DH 金鑰對(僅用於此連線)並發送其 DH 公鑰。

  2. 伺服器也會產生新的 DH 金鑰對。它還從磁碟加載其 SSH“主機金鑰”金鑰對。

    然後它跡象DH 公鑰和 SSH 私鑰,並將兩個公鑰(以及簽章)傳送給用戶端。

  3. 用戶端檢查簽名並驗證伺服器的 SSH 公鑰是否在known_hosts中。

    然後它同時使用DH金鑰(客戶端的私鑰 + 伺服器的公鑰)來產生共用加密金鑰,並丟棄其 DH 金鑰對。

  4. 伺服器也使用兩個 DH 金鑰(伺服器的私有金鑰 + 用戶端的公用金鑰)來產生相同的共用加密金鑰,並丟棄其 DH 金鑰對。

  5. 雙方均啟用加密。

(還有一些其他密鑰交換方法,但很少使用。)

下一步是客戶端認證。請注意,此時連線已加密,即使客戶端的 SSH 金鑰尚未使用!

  1. 客戶端發送“服務請求”以進行客戶端身份驗證。

  2. 伺服器提供一些機制——“密碼”、“公鑰”,可能還有其他機制。

  3. 如果您有 SSH 金鑰對,則用戶端選擇“公鑰”,發送您的 SSH 公鑰,並使用您的 SSH 私鑰對伺服器提供的一些隨機資料進行簽名,以證明金鑰所有權。

    如果您沒有 SSH 金鑰對,用戶端會選擇「密碼」並直接發送您的密碼 - 但仍在加密隧道內。

相關內容