前言
每次透過 SSH 連線到遠端 Linux 伺服器都要輸入密碼,不僅麻煩,也存在安全隱憂——密碼可能被暴力破解或在傳輸中洩漏。SSH 金鑰認證(Public Key Authentication)是更安全也更方便的替代方案:設定完成後,連線時不再需要輸入密碼,同時大幅提升安全性。
本文將以 Windows 10(版本 10.0.19045) 連線至 Ubuntu 24.04 LTS 為例,帶你從零開始完成整個設定流程。
環境說明
| 項目 | 說明 |
|---|---|
| 本機(Client) | Windows 10 (10.0.19045.6466),使用內建 OpenSSH 客戶端 |
| 遠端(Server) | Ubuntu 24.04.4 LTS,核心版本 6.17.0-14-generic |
| 遠端 IP | 192.168.51.191 |
| 遠端使用者 | ubuntu |
第一步:確認本機是否已有金鑰
開啟 Windows 的命令提示字元(CMD)或 PowerShell,檢查是否已存在金鑰:
dir %USERPROFILE%\.ssh\id_rsa.pub
如果顯示找不到檔案,表示尚未產生金鑰,請繼續下一步。如果已經有了,可以跳到第三步。
第二步:產生 SSH 金鑰對
在命令提示字元中執行:
ssh-keygen
過程中會詢問儲存位置和密碼短語(passphrase),一般直接按 Enter 採用預設值即可。完成後會在 C:\Users\你的使用者名稱\.ssh\ 目錄下產生兩個檔案:
- id_rsa:私鑰(絕對不可外洩,僅保留在本機)
- id_rsa.pub:公鑰(要傳送到遠端伺服器)
第三步:將公鑰傳送到遠端伺服器
為什麼不能用 ssh-copy-id?
在 Linux 或 macOS 上,通常可以用 ssh-copy-id 一行指令搞定。但在 Windows 上執行會出現以下錯誤:
C:\Users\user>ssh-copy-id [email protected]
'ssh-copy-id' 不是內部或外部命令、可執行的程式或批次檔。
這是因為 Windows 內建的 OpenSSH 客戶端並未附帶 ssh-copy-id 工具。不過別擔心,我們可以用管道(pipe)指令達成同樣的效果。
替代方案:使用 type 搭配 ssh
在 CMD(命令提示字元) 中執行:
type %USERPROFILE%\.ssh\id_rsa.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
如果使用 PowerShell,則改用:
Get-Content $env:USERPROFILE\.ssh\id_rsa.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
這行指令做了以下幾件事:
- 讀取本機的公鑰內容
- 透過 SSH 連線到遠端伺服器
- 在遠端建立
~/.ssh目錄(如果不存在) - 設定目錄權限為 700(僅擁有者可讀寫執行)
- 將公鑰附加寫入
authorized_keys檔案 - 設定檔案權限為 600(僅擁有者可讀寫)
首次連線的信任確認
如果是第一次連線到這台伺服器,會看到以下提示:
The authenticity of host '192.168.51.191 (192.168.51.191)' can't be established.
ED25519 key fingerprint is SHA256:rpCMSBdUxtGEUHJrD3gBzjef9/OTrhqxMRv7FpgadI0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
這是 SSH 在確認遠端伺服器的身分。輸入 yes 後,這台伺服器的指紋會被記錄到本機的 known_hosts 檔案中,未來連線不會再詢問。
接著輸入遠端使用者的密碼,公鑰就會被寫入伺服器。這是你最後一次需要輸入密碼。
第四步:驗證免密碼登入
傳送完公鑰後,再次連線:
ssh [email protected]
如果一切設定正確,你會直接看到 Ubuntu 的歡迎訊息,不再被要求輸入密碼:
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.17.0-14-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
ubuntu@fei:~$
恭喜!你已成功設定 SSH 金鑰認證。
進階建議:強化安全性
金鑰登入設定完成後,建議進一步關閉密碼登入,防止暴力破解攻擊。
在遠端伺服器上編輯 SSH 設定檔:
sudo vim /etc/ssh/sshd_config
找到以下項目並修改:
PasswordAuthentication no
PubkeyAuthentication yes
儲存後重啟 SSH 服務:
sudo systemctl restart ssh
從此之後,只有持有正確私鑰的電腦才能登入這台伺服器。
常見問題排解
金鑰登入仍被要求輸入密碼
最常見的原因是權限設定不正確。在遠端伺服器上確認:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
SSH 對權限非常嚴格——如果目錄或檔案的權限太寬鬆,會自動拒絕金鑰認證。
想要使用不同的金鑰檔案
如果你有多組金鑰,可以在連線時指定:
ssh -i C:\Users\user\.ssh\my_other_key [email protected]
或者在 C:\Users\user\.ssh\config 中設定:
Host myserver
HostName 192.168.51.191
User ubuntu
IdentityFile ~/.ssh/my_other_key
之後只需輸入 ssh myserver 即可連線。
總結
SSH 金鑰認證的設定只需要幾分鐘,卻能帶來長期的便利與安全性提升。雖然 Windows 缺少 ssh-copy-id 工具,但透過 type 搭配管道的方式,同樣能輕鬆完成公鑰部署。設定完成後記得關閉密碼登入,讓你的伺服器更加安全。


