SSH免密登录配置指南

学习如何在各种操作系统上配置SSH免密登录,以便使用SSH-Tunnel

SSH免密登录介绍


SSH免密登录允许您在不输入密码的情况下连接到远程服务器,这对于使用SSH-Tunnel工具非常重要。免密登录通过公钥/私钥对实现,本指南将详细介绍如何在不同操作系统上配置SSH免密登录。

SSH免密登录的基本原理是:将您本地生成的公钥放置在远程服务器上,当您尝试连接时,远程服务器会使用公钥验证您持有的私钥,从而实现免密登录。

无论您使用什么操作系统,SSH免密登录的基本流程都是相似的:

  1. 在本地生成SSH密钥对(如果还没有)
  2. 将公钥传输到远程服务器
  3. 在远程服务器上将公钥添加到授权文件
  4. 测试免密登录

请选择适合您操作系统的指南部分:

Linux系统SSH免密登录配置


1 生成SSH密钥对

在终端中执行以下命令生成SSH密钥对:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

执行后,系统会提示:

Enter file in which to save the key (/home/username/.ssh/id_rsa):

直接按回车键接受默认路径,然后系统会询问是否设置密码:

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

您可以直接按回车键跳过密码设置(实现真正的免密登录),或者设置一个密码以提高安全性。

2 将公钥复制到远程服务器

Linux提供了简便的ssh-copy-id工具:

ssh-copy-id username@remote_host

首次连接时会提示确认服务器指纹,输入yes确认,然后输入远程服务器密码。

替代方法: 如果ssh-copy-id不可用,可以手动复制:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys"

3 设置正确的权限

确保SSH目录和文件权限正确:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys  # 在远程服务器上执行

4 测试免密登录

尝试SSH登录到远程服务器:

ssh username@remote_host

如果配置正确,您应该能够无需输入密码直接登录。

成功配置后,您就可以使用SSH-Tunnel工具建立隧道连接,而无需每次输入密码。

macOS系统SSH免密登录配置


1 生成SSH密钥对

macOS的Terminal终端操作与Linux类似:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

按回车键接受默认存储位置(通常是~/.ssh/id_rsa)。

系统会询问是否设置密码,您可以直接按回车键跳过(实现免密登录)或设置密码。

2 将公钥复制到远程服务器

macOS也支持ssh-copy-id命令,但如果没有安装,可以通过Homebrew安装:

brew install ssh-copy-id

然后执行:

ssh-copy-id username@remote_host

或者使用手动方法:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys"

3 添加到SSH代理(可选)

为了避免每次重启后都需要重新输入密钥密码(如果设置了),可以添加到SSH代理:

ssh-add -K ~/.ssh/id_rsa

在macOS Sierra 10.12.2及更高版本,您可能需要在~/.ssh/config文件中添加以下配置:

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa

4 测试连接

ssh username@remote_host

应该可以直接登录,无需输入密码。

Windows系统SSH免密登录配置


1 使用OpenSSH(Windows 10/11内置)

较新的Windows版本已内置OpenSSH,可以通过PowerShell生成密钥:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

默认会将密钥保存在C:\\Users\\username\\.ssh\\id_rsa

2 复制公钥到远程服务器

Windows 10/11可以使用以下PowerShell命令:

type $env:USERPROFILE\.ssh\id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

或者手动复制公钥文件内容:

  1. 打开公钥文件:notepad $env:USERPROFILE\.ssh\id_rsa.pub
  2. 复制文件内容
  3. 登录到远程服务器
  4. 编辑~/.ssh/authorized_keys文件,将公钥内容粘贴到新行

3 使用适当的配置文件(可选)

创建或编辑%USERPROFILE%\.ssh\config文件:

Host remote_nickname
    HostName remote_host_ip_or_domain
    User username
    IdentityFile ~/.ssh/id_rsa

有了这个配置,您可以简单地使用ssh remote_nickname进行连接。

4 使用SSH代理(可选)

在PowerShell中执行:

# 启动SSH代理服务
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent

# 添加私钥
ssh-add $env:USERPROFILE\.ssh\id_rsa
使用Git Bash(替代方案)

如果您安装了Git for Windows,可以使用Git Bash执行与Linux/macOS相同的命令,操作流程与Linux部分完全一致。

5 测试连接

ssh username@remote_host

如果配置正确,您应该能够直接登录而无需输入密码。

验证配置


无论您使用哪种操作系统,验证SSH免密登录是否成功的方法是一致的:

ssh -v username@remote_host

添加-v参数会显示详细的调试信息,帮助您识别可能的问题。

成功的免密登录应该直接让您进入远程系统的命令行,无需输入密码。

使用SSH-Tunnel验证

成功配置SSH免密登录后,您可以使用以下命令启动SSH-Tunnel:

./ssh-tunnel -s username@remote_host

如果隧道能成功建立,说明SSH免密登录配置正确。

常见问题排查


如果SSH仍然要求输入密码,请检查:

  • 公钥是否正确添加到远程服务器的~/.ssh/authorized_keys文件
  • 远程服务器上~/.ssh目录和authorized_keys文件的权限:
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  • 远程服务器的SSH配置是否允许公钥认证:
    # 检查 /etc/ssh/sshd_config 文件
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys

如果出现Permission denied (publickey)错误:

  • 确认您使用的是正确的用户名和主机名
  • 检查SSH服务器日志(通常在/var/log/auth.log/var/log/secure
  • 验证您的私钥路径是否正确
  • 使用ssh -i ~/.ssh/id_rsa username@remote_host明确指定私钥

如果遇到密钥类型或格式问题:

  • 某些老旧系统可能不支持较新的密钥类型,尝试使用RSA:
    ssh-keygen -t rsa -b 2048 -C "your_email@example.com"
  • 确保公钥格式正确,应该是单行文本,以ssh-rsa或其他算法标识符开头
  • Windows用户注意:文本文件可能有不同的行尾格式,确保公钥文件没有额外的回车或换行