SSH 密鑰入門:公鑰、私鑰與 config 到底是什麼
面向新手解釋 SSH 公鑰、私鑰、密碼口令和主機密鑰的區別,並用獨立密鑰與 SSH config 簡化 VPS 登入。
上一課我們用 SSH 第一次連接了 VPS。密碼登入容易理解,卻也容易遇到弱密碼、重複使用和暴力猜測等問題。更常見的長期做法是使用 SSH 密鑰。
第一次看到「公鑰、私鑰、主機密鑰」時很容易混亂。先記住一句話:用戶密鑰證明「你是誰」,主機密鑰幫助確認「伺服器是誰」。 它們不是同一套東西。
一、公鑰和私鑰怎樣配合
可以把用戶密鑰想成一把不能複製給別人的鑰匙和一把安裝在門上的鎖:
| 文件 | 在哪裡 | 能否分享 | 用途 |
|---|---|---|---|
| 私鑰 | 你的電腦 | 不能 | 證明登入者持有正確鑰匙 |
公鑰(通常以 .pub 結尾) | 可以複製到伺服器 | 可以 | 告訴伺服器允許哪把私鑰登入 |
| 私鑰密碼口令 | 只由你記住或交給系統鑰匙串 | 不能 | 私鑰文件被拿走時再增加一道保護 |
伺服器保存公鑰,不需要得到你的私鑰。登入時,雙方透過密碼學過程完成驗證,私鑰本身不會發送到伺服器。
因此,看到教程要求你「把私鑰上傳到伺服器」時應當停下來複核。私鑰也不應該放進公開 Git 倉庫、文章截圖、聊天記錄或網盤共享連結。
二、為學習用 VPS 單獨生成一把密鑰
在自己的 Mac 或 Linux 電腦上,可以生成一把獨立的 Ed25519 密鑰:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_vps_learning -C "vps-learning"命令中各部分的意思是:
-t ed25519:選擇現代、常用的密鑰算法;-f:指定文件名,避免無意覆蓋已有密鑰;-C:添加便於自己辨認的註釋,不參與認證。
命令會詢問是否設置口令。對於日常使用的私鑰,建議設置一個獨立口令;如果使用系統鑰匙串或 ssh-agent,通常不需要每次都重新輸入。
生成後會得到兩個文件:
~/.ssh/id_ed25519_vps_learning 私鑰,不能外傳
~/.ssh/id_ed25519_vps_learning.pub 公鑰,可以安裝到伺服器三、把公鑰安裝到伺服器
最穩妥的入口通常是服務商控制面板提供的 SSH Key 功能:創建或重裝 VPS 時貼上 .pub 文件的內容。已經能用密碼登入時,也可以使用系統提供的 ssh-copy-id,但 macOS 未必預裝這個工具。
無論採用哪種方式,伺服器最終都是把一整行公鑰寫入目標用戶的:
~/.ssh/authorized_keysSSH 對文件權限比較嚴格。常見權限是目錄 ~/.ssh 僅本人可訪問,authorized_keys 僅本人可寫。如果權限過寬,服務端可能為了安全而拒絕使用它。
這裡最重要的不是背下命令,而是確認三件事:
1. 公鑰安裝給了正確的 Linux 用戶; 2. 貼上的是 .pub 內容,而不是私鑰; 3. 在關閉密碼登入以前,密鑰登入已經從另一扇終端窗口驗證成功。
四、用 SSH config 把長命令變短
假設教程裡的示例伺服器地址是 203.0.113.10,用戶是 admin,每次完整輸入會很繁瑣:
ssh -i ~/.ssh/id_ed25519_vps_learning admin@203.0.113.10可以在本機的 ~/.ssh/config 中添加一個別名:
Host learning-vps
HostName 203.0.113.10
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519_vps_learning
IdentitiesOnly yes以後只需:
ssh learning-vpsHost 是你自己取的本地別名;HostName 才是伺服器地址。IdentitiesOnly yes 表示只嘗試這裡指定的密鑰,可減少電腦裡密鑰很多時的混亂。
示例中的 203.0.113.10 是 RFC 5737 保留的文檔地址,不能當成真實伺服器使用。你要換成控制面板顯示的地址,但不要把真實 IP 連同用戶名和配置一起公開。
五、不要混淆用戶密鑰與主機密鑰
| 名稱 | 誰持有私密部分 | 回答的問題 |
|---|---|---|
| 用戶密鑰 | 登入者 | 「這個人有權限嗎?」 |
| 主機密鑰 | SSH 伺服器 | 「我連接的是原來那台伺服器嗎?」 |
第一次連接時看到的 SHA256 指紋屬於主機密鑰。它應該透過服務商控制台等獨立渠道核對。以後主機密鑰突然變化,可能只是伺服器重裝,也可能意味著地址被複用或連接被攔截;不要為了消除警告就直接刪除舊記錄。
六、安全切換順序
把密碼登入改成密鑰登入時,建議按這個順序操作:
1. 保存服務商網頁控制台或救援入口; 2. 新建日常管理用戶並安裝公鑰; 3. 保持原會話不退出,從第二個終端驗證密鑰登入; 4. 確認新用戶擁有所需的 sudo 權限; 5. 再逐項評估是否限制 root 與密碼登入; 6. 每改一項就開新會話驗證,並觀察 SSH 日誌。
不要同時改連接埠、防火牆、用戶和認證方式。一次改變太多變數,失敗時很難知道是哪一層出了問題,也更容易把自己鎖在門外。
七、密鑰也需要維護
- 每台重要設備或不同用途使用可辨認的獨立密鑰;
- 設備丟失或成員離開時,從
authorized_keys撤銷對應公鑰; - 懷疑私鑰洩露時,生成新密鑰、完成替換,再刪除舊公鑰;
- 備份私鑰時使用可靠加密,並測試恢復流程;
- 不把「密鑰不會過期」理解成「永遠不用輪換」。
八、總結
SSH 密鑰並不是一段更長的密碼。它把「可公開安裝的公鑰」和「只留在本機的私鑰」分開,讓伺服器可以驗證你是否持有正確私鑰。~/.ssh/config 則負責保存非秘密的連接參數,讓日常登入更清楚。
真正安全的切換有兩個前提:私鑰從未外傳,以及新登入方式已經在第二個會話中驗證成功。
常見問題
.pub 文件可以發給別人嗎?
公鑰本來就用於分發,但仍應只安裝到你信任、確實需要訪問的系統。私鑰文件絕不能發給別人。
設置了私鑰密碼口令,自動任務怎麼辦?
優先考慮權限更小的專用密鑰、ssh-agent、短期憑據或任務系統的秘密管理功能,不要為了方便把無口令的高權限私鑰到處複製。
可以刪除密碼登入嗎?
可以評估,但必須先確認密鑰、sudo 和救援控制台都能工作。不同鏡像和雲平台的預設設置不同,不應直接複製一條命令就關閉入口。
參考來源
Share