我想在我的電腦和伺服器之間設定 SFTP 連線。
我在電腦上產生了一對金鑰,並將公鑰寫入伺服器上的「authorized_keys」檔案中。我確信它有效,因為當我嘗試從沒有我的私鑰的電腦進行連接時(我知道,其他人不應該擁有它),系統會要求輸入密碼。
根據這個圖片,我的伺服器是 Bob,我的電腦是 Alice。當伺服器發送訊息時,它使用我的公鑰對其進行加密,我使用我的私鑰對其進行解密。但是如果我向伺服器發送訊息,它不會加密,不是嗎?如果是的話,是如何加密的?
根據我對非對稱加密的理解,如果我想加密我發送的訊息,我必須在伺服器上產生一對金鑰並將其公鑰放在我電腦的「authorized_keys」檔案中,對吧?
我怎麼能夠核實連接在兩種方式(發送和接收)上都是安全的?
謝謝!
答案1
SSH 連線中發生了 2 個主要事件:
伺服器驗證和加密
伺服器向您發送他的公鑰,您必須信任它。您可以在此之前手動獲取它,並且在理想的安全環境中,您永遠不會在知道其公鑰正確之前連接到 SSH 伺服器。 CA 的用途是簽署伺服器公鑰。在大多數 SSH 環境中,您只需接受伺服器的公鑰作為客戶端。這是最初的“您想信任該伺服器並將其添加到您的清單嗎?”問題。Linux 系統中伺服器公鑰儲存在客戶端的 .ssh/known_hosts 下。
連接的實際加密並不是不對稱的。 這是許多人對私鑰/公鑰加密的巨大誤解。這太慢了。真正發生的是伺服器和客戶端產生一個共享秘密(也稱為長密碼),即對稱加密對於這一屆會議。客戶端和伺服器使用非對稱加密,直到他們就共享秘密達成協議。之後,他們切換到對稱加密,並以此共享秘密作為密鑰。
這種類型的加密是最常見的,稱為混合加密,儘管幾乎每個人(錯誤地)稱之為非對稱加密。
「真正的」、純粹的非對稱加密的一個例子是使用 PGP 的郵件加密,因為每個訊息都是非對稱加密的。
另外:共享秘密不會永久存儲,每個新會話都會協商一個新的共享秘密。
客戶端認證
這是完全不同的事情,這可以是基於密碼和/或金鑰的身份驗證。客戶端的公鑰(位於~/.ssh/id_rsa.pub 下)必須存在於伺服器的authorized_keys 檔案中(例如對於root:/root/.ssh/authorized_keys)。在存在之前ssh-copy-id
人們會做類似的事情
cat ~/.ssh/id_rsa.pub | ssh root@server "cat >> ~/.ssh/authorized_keys"
將您的金鑰附加到伺服器的authorized_keys中。
客戶端憑證不用於加密,僅用於身份驗證。
重要編輯:ssh-copy-id
為防止誤解,貼文更加明確。
到目前為止,ssh-copy-id
這是將客戶端公鑰添加到伺服器的最佳實踐方法。我剛剛發布了cat
顯示雙方操作哪些文件的方法,以顯示私鑰和公鑰之間的連接以及它們的儲存方式。
當使用 cat 時,有忘記「>」的風險,例如這會覆蓋您的authorized_keys檔案(在Linux中「>>」表示追加,「>」表示覆蓋)。直接操作設定檔時要負責。感謝@Rallph 指出這一點。
答案2
伺服器有自己的密鑰對。當您第一次連接到 SSH 伺服器時,如果您信任伺服器的主機金鑰(= 公鑰),您應該會收到 SSH/SFTP 用戶端的提示。
只有當您仔細驗證它確實是伺服器的合法公鑰後,您的連線才是安全的。看我的文章從哪裡取得 SSH 主機金鑰指紋來授權伺服器?
另請注意,您的金鑰對和伺服器的金鑰對實際上都不用於加密資料。那是一種更複雜的方式。
也可以看看: