📌 适用场景

  • ✅ 已在本地生成 SSH 密钥对(id_ed25519 & id_ed25519.pub

  • ✅ 拥有服务器 root 权限及公网 IP:PORT(如 172.0.21.30:45003

  • ❌ 当前仍需要输入密码才能登录服务器

  • ❗ 目标:实现无需密码的自动化登录


🧩 问题本质解析

现象

根本原因

典型表现

仍需输入密码

SSH 服务端未启用密钥认证

ssh: Connecting... 后提示 password:

连接立即断开

① 私钥/公钥不匹配
② 权限错误
③ 服务端配置拒绝

Connection closed by IP port Port

首次连接失败

防火墙拦截 / 端口未开放

Operation timed out


🛠️ 五步解决方案

第一步:准备阶段 - 确保本地环境就绪


# 检查现有密钥是否存在
ls $env:USERPROFILE\.ssh\id_ed25519*

# 若缺失则重新生成(推荐 ed25519 算法)
ssh-keygen -t ed25519 -C "your_email@example.com"

💡 提示:Windows 用户请注意默认存储路径为 C:\Users\<用户名>\.ssh\


第二步:上传公钥到服务器(三种方法任选)

▶️ 方法一:PowerShell 快速推送(推荐新手)

# 1. 读取公钥内容
$pubKey = Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" -Raw
# 2. 执行推送命令(会自动创建 .ssh 目录)
ssh -p 45003 root@172.0.21.30 "mkdir -p ~/.ssh && echo '$pubKey' >> ~/.ssh/authorized_keys"

⚠️ 注意:此命令会提示输入服务器密码,这是最后一次人工干预!

▶️ 方法二:手动复制(适合复杂环境)

  1. 用文本编辑器打开 id_ed25519.pub 并全选复制内容

  2. 通过普通 SSH 登录服务器:

ssh -p 45003 root@172.0.21.30
  1. 在服务器终端执行:

mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys  # 粘贴公钥后保存chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

▶️ 方法三:使用 PuTTYgen(图形化工具)

  1. 下载 PuTTYgen.exe 并运行

  2. 加载你的 id_ed25519 私钥 → 点击 "Public key for pasting into OpenSSH authorized_keys file"

  3. 复制生成的新公钥字符串 → 按方法二步骤3操作


第三步:配置服务器 SSH 服务


# 编辑配置文件(重要!)
sudo nano /etc/ssh/sshd_config

# 确保以下参数已启用(取消注释并修改):
PubkeyAuthentication yes          # 允许密钥认证
PermitRootLogin yes               # 允许root登录
PasswordAuthentication no         # 禁用密码登录(可选但推荐)
ChallengeResponseAuthentication no # 禁用交互式认证# 

保存后重启服务
sudo systemctl restart sshd       # Ubuntu/Debian
sudo service ssh restart         # CentOS/RHEL

🔍 关键检查点

  • 如果之前修改过该文件,建议先备份:sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

  • 某些云服务商镜像可能需要额外设置:UsePAM yes


第四步:修复常见权限问题

A. 服务器端权限校验

# 检查权限是否正确ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys

# 正确输出应为:
# drwx------ 2 root root 4096 Jan 1 00:00 /root/.ssh# -rw------- 1 root root  790 Jan 1 00:00 /root/.ssh/authorized_keys
# 修复错误权限chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

B. 本地私钥权限修复(Windows专属)


icacls "$env:USERPROFILE\.ssh\id_ed25519" /inheritance:r /grant:r "Administrators:(R)" "Default:(R)"

第五步:验证无密码登录

# 测试连接(不应再提示输入密码)
ssh -p 45003 root@172.0.21.30
# 如果仍然失败,开启调试模式排查
ssh -vvv -p 45003 root@172.0.21.30

📝 调试要点

  • debug1: Offering public key: ... → 表示正在尝试使用密钥

  • authentication succeeded → 成功标志

  • Permission denied → 检查权限或服务端配置


💎 进阶优化建议

✔️ VS Code 远程开发配置

  1. 安装扩展:Remote - SSH

  2. 修改配置文件 ~/.ssh/config

Host myserver
    HostName 172.0.21.30
    Port 45003
    User root
    IdentityFile C:\Users\Administrator\.ssh\id_ed25519
    IdentitiesOnly yes
  1. 在 VS Code 中按 F1 → 输入 Remote-SSH: Connect to Host... → 选择 myserver

🔄 多设备同步密钥


# 导出公钥供其他设备使用
type "$env:USERPROFILE\.ssh\id_ed25519.pub" | clip   
# 复制到剪贴板

🔐 安全加固措施

项目

建议值

说明

私钥密码

强口令

生成密钥时设置 passphrase

SSH 端口

非常规端口

避免使用 22 默认端口

最大尝试次数

≤3

防止暴力破解

TTL 限制

≤60秒

减少会话劫持风险


❓ 常见问题速查表

症状

可能原因

解决方案

Permission denied (publickey)

① 公钥未正确部署
② 权限错误

检查 ~/.ssh/authorized_keys 权限
重新上传公钥

Connection refused

① 端口未开放
② SSH 服务未运行

检查防火墙规则
systemctl status sshd

Host key verification failed

主机指纹变更

执行 ssh-keygen -R [IP]:[PORT]

Too many authentication failures

多次失败尝试

等待 15 分钟后重试

Agent admitted failure to sign using the key

GPG Agent 问题

重启电脑或重置 SSH_AUTH_SOCK 环境变量


现在你应该已经实现了完全无需密码的 SSH 登录!如果遇到任何新问题,欢迎随时提问。Happy coding! 🚀