透過 SSH 金鑰認證取代密碼登入,不僅提升安全性 (防暴力破解),更能實現自動化部署、腳本遠端執行、Git 操作等無人值守場景。本文詳細說明從金鑰產生、公鑰分發、權限設定到疑難排解的完整流程。

ssh-keygen -t rsa -b 4096
# 提示儲存路徑:~/.ssh/id_rsa (私鑰)、~/.ssh/id_rsa.pub (公鑰)
# 建議設定 passphrase 保護私鑰 (可留空為自動化用途)
ssh user@remote-host "mkdir -p ~/.ssh"
cat ~/.ssh/id_rsa.pub | ssh user@remote-host 'cat >> ~/.ssh/authorized_keys'
ssh user@remote-host "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
# 自動完成步驟 2-4
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote-host
ssh user@remote-host
# 應直接進入 Shell,無密碼提示
| 錯誤現象 | 原因 | 修復指令 |
|---|---|---|
| 仍提示輸入密碼 | authorized_keys 權限過寬 (如 644) |
chmod 600 ~/.ssh/authorized_keys |
日誌顯示 Authentication refused: bad ownership or modes |
~/.ssh 目錄權限錯誤 (需 700) |
chmod 700 ~/.ssh |
| 金鑰類型不支援 | 遠端 SSH 版本過舊不支援 RSA/ED25519 | 改用 ssh-keygen -t rsa -b 2048 或升級遠端 OpenSSH |
| SELinux 環境下拒絕 | 安全上下文標籤錯誤 | restorecon -Rv ~/.ssh |
| 多金鑰衝突 | SSH Client 嘗試錯誤金鑰超過 MaxAuthTries |
指定金鑰 ssh -i ~/.ssh/id_rsa_custom user@host 或設定 ~/.ssh/config |
# ~/.ssh/config
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github
IdentitiesOnly yes
Host myserver
HostName 192.168.1.100
User admin
IdentityFile ~/.ssh/id_rsa_myserver
Port 2222
使用時:ssh github、ssh myserver 自動套用對應金鑰與參數。
ssh-agent 快取解密狀態/etc/ssh/sshd_config 設定 PasswordAuthentication no 強制金鑰認證ED25519 金鑰 (ssh-keygen -t ed25519) 取得更高安全性與效能ssh-keygen -U (OpenSSH 8.2+) 硬體安全金鑰 (FIDO/U2F) 支援完成設定後,即可享受安全、高效、自動化的 SSH 遠端操作體驗。