Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

SSH/SCP 免密碼登錄配置:密鑰對生成與分發全流程

編輯:Linux 系統常見問題解答

核心原理

非對稱加密:客戶端持有私鑰 (id_rsa),服務端存儲對應公鑰 (authorized_keys)。認證時客戶端證明擁有私鑰,無需傳輸密碼。

步驟 1:生成密鑰對 (客戶端)


ssh-keygen -t rsa -b 4096 -C "user@host-$(date +%F)"
# -t rsa: 加密算法 (推薦 rsa 4096 或 ed25519)
# -b 4096: 密鑰長度
# -C: 註釋 (便於識別)

# 交互提示:
# Enter file in which to save the key (/home/user/.ssh/id_rsa): [回車接受默認]
# Enter passphrase (empty for no passphrase): [可輸入密語保護私鑰,或留空自動化]
# Enter same passphrase again: [確認]

生成文件:

  • ~/.ssh/id_rsa:私鑰 (權限 600,**極其機密**)
  • ~/.ssh/id_rsa.pub:公鑰 (可公開分發)

步驟 2:分發公鑰到服務端

方法一:ssh-copy-id (推薦,自動處理權限、目錄創建)


ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
# 輸入一次密碼,自動追加公鑰至遠程 ~/.ssh/authorized_keys

方法二:手動分發 (無 ssh-copy-id 時)


# 1. 確保遠程 .ssh 目錄存在且權限正確
ssh user@remote_host "mkdir -p ~/.ssh && chmod 700 ~/.ssh"

# 2. 追加公鑰
cat ~/.ssh/id_rsa.pub | ssh user@remote_host "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

步驟 3:驗證免密登錄


ssh user@remote_host
# 應直接進入 Shell,無需輸入密碼

# 測試 SCP
scp /local/file user@remote_host:/remote/path

關鍵權限要求 (服務端)

權限錯誤會導致 SSH 拒絕公鑰認證,回退密碼認證。

進階配置 (~/.ssh/config 客戶端簡化)


Host myserver
    HostName 192.168.1.100
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_rsa_myserver
    # 連接保活
    ServerAliveInterval 60
    ServerAliveCountMax 3
    # 多路復用 (加速後續連接)
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600

之後直接 ssh myserver 即可。

撤銷授權


# 服務端:從 authorized_keys 刪除對應公鑰行
# 或修改 authorized_keys 文件添加 restrict 選項限制功能
# 客戶端:刪除私鑰文件 (洩露時必須)

常見故障排查


# 1. 開啟調試模式查看認證過程
ssh -vvv user@remote_host

# 2. 檢查服務端日誌
tail -f /var/log/auth.log   # Debian/Ubuntu
tail -f /var/log/secure     # CentOS/RHEL

# 3. 常見錯誤
# "Permission denied (publickey)" → 權限錯誤、公鑰未授權、私鑰不匹配
# "Agent admitted failure to sign using the key" → ssh-agent 未運行或未添加鑰
#   解決: eval $(ssh-agent) && ssh-add ~/.ssh/id_rsa
Copyright © Windows教程網 All Rights Reserved
路徑權限擁有者說明
~/.ssh700 (drwx------)user:user僅擁有者可進入
~/.ssh/authorized_keys600 (-rw-------)user:user僅擁有者可讀寫
~/.ssh/id_rsa (客戶端)600user:user私鑰絕對不可被其他用戶讀取