[指令日記] 012 從 Windows 使用 SSH 金鑰免密碼登入 Ubuntu 完整教學

前言

每次透過 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"

這行指令做了以下幾件事:

  1. 讀取本機的公鑰內容
  2. 透過 SSH 連線到遠端伺服器
  3. 在遠端建立 ~/.ssh 目錄(如果不存在)
  4. 設定目錄權限為 700(僅擁有者可讀寫執行)
  5. 將公鑰附加寫入 authorized_keys 檔案
  6. 設定檔案權限為 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 搭配管道的方式,同樣能輕鬆完成公鑰部署。設定完成後記得關閉密碼登入,讓你的伺服器更加安全。

飛飛
飛飛

講師學歷:臺科資工所、逢甲資工系畢業。
技術專長:OSINT、滲透測試、網站開發、專業易懂教育訓練。
證照書籍:OSCP、OSCE³、著《資安這條路:領航新手的 Web Security 指南》。
教學經驗:60+ 企業教學經驗、指導過上百位學員。
教學特色:新手友善、耐心指導、擅長圖解(流程圖、心智圖)引導學習。
社群經驗:目前經營全臺資安社群 CURA,曾任臺科資安社社長、逢甲黑客社社長。
社群交流:LINE 社群《飛飛的資安大圈圈》,即時分享經驗、鼓勵交流。
社群分享:FB 粉專《資安這條路,飛飛來領路》,分享文章與圖卡整理。
個人網站:feifei.tw 分享資安技術文章;pbtw.tw 分享 AI 相關應用;ssdlc.feifei.tw 分享軟體安全開發流程文章。