1. 为什么需要SSH免密登录?

每次连接远程服务器都要输入密码,这大概是开发者最讨厌的事情之一。密码太简单不安全,太复杂记不住,输错几次还可能被锁定账号。我在团队协作开发时就遇到过这种情况——十几个开发者共用几台测试服务器,每天光是输密码就浪费大量时间,更别提密码泄露的安全隐患了。

SSH密钥认证就像给你的电脑配了把专属钥匙。本地生成一对密钥(公钥+私钥),把公钥放到服务器上。下次连接时,服务器看到你带着匹配的私钥就直接放行。这比密码验证更安全(非对称加密无法被暴力破解),也更方便(一次配置永久生效)。实测下来,团队采用密钥认证后,服务器连接效率提升70%以上。

2. 密钥生成与本地配置

2.1 生成密钥对

打开终端(Windows用PowerShell或CMD,Mac/Linux用Terminal),执行这个魔法命令:

ssh-keygen -t rsa -b 4096

你会看到这样的交互提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/yourname/.ssh/id_rsa):

直接回车使用默认路径,接着会询问是否设置密码(passphrase)。强烈建议留空,否则免密登录就失去意义了。最终会在~/.ssh目录生成两个文件:

  • id_rsa:私钥(必须严格保密)
  • id_rsa.pub:公钥(可以随便分发)

安全提示:如果多人共用设备,建议用-f参数指定自定义路径,比如ssh-keygen -f ~/.ssh/work_rsa

2.2 多设备密钥管理

当你有多个设备(比如办公室电脑+家用笔记本)时,有两种方案:

  1. 共享密钥:把id_rsa文件复制到所有设备(简单但有安全风险)
  2. 独立密钥:每台设备生成独立密钥(推荐)

采用方案2时,建议用设备名命名密钥文件:

# 笔记本上执行
ssh-keygen -f ~/.ssh/laptop_rsa

# 台式机上执行  
ssh-keygen -f ~/.ssh/desktop_rsa

3. 服务器端配置

3.1 上传公钥

假设服务器IP是192.168.1.100,用户名为devuser,用这条命令上传公钥:

ssh-copy-id -i ~/.ssh/id_rsa.pub devuser@192.168.1.100

如果没装ssh-copy-id,可以用这个替代方案:

cat ~/.ssh/id_rsa.pub | ssh devuser@192.168.1.100 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

3.2 权限检查

服务器上执行这些命令修复常见权限问题:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

我曾遇到过因为权限太宽松导致认证失败的情况,错误提示是"Permissions 0644 are too open"。这时候用ls -la ~/.ssh检查,正确的权限应该是:

drwx------  .ssh
-rw-------  authorized_keys

3.3 多设备密钥合并

当第二台设备要接入时,不要覆盖原有authorized_keys!用追加模式:

# 本地执行
scp ~/.ssh/laptop_rsa.pub devuser@192.168.1.100:~/temp.pub

# 服务器执行
cat ~/temp.pub >> ~/.ssh/authorized_keys
rm ~/temp.pub

4. VSCode终极配置

4.1 安装Remote-SSH插件

在扩展商店搜索安装官方插件"Remote - SSH",装完后左侧会出现远程资源管理器图标。

4.2 配置SSH Host

Ctrl+Shift+P调出命令面板,输入"Remote-SSH: Open Configuration File",选择你的SSH配置文件(通常是~/.ssh/config)。参考这个模板:

Host dev-server
  HostName 192.168.1.100
  User devuser
  IdentityFile ~/.ssh/id_rsa
  PreferredAuthentications publickey

关键点

  • IdentityFile指定私钥路径(多设备时要对应各自的密钥)
  • 主机别名(如dev-server)可以替代IP地址

4.3 连接测试

在VSCode远程资源管理器点击"Connect to Host",选择配置好的主机名。如果看到新窗口底部状态栏显示"SSH:dev-server",恭喜你成功了!

5. 故障排查指南

问题1:连接时报"Permission denied (publickey)"

  • 检查authorized_keys文件是否有换行符
  • 在服务器执行tail -f /var/log/auth.log查看实时日志

问题2:VSCode反复弹出密码框

  • 确认config文件中的IdentityFile路径正确
  • 尝试在终端先用命令行连接:ssh dev-server

问题3:多设备连接冲突

  • 确保每台设备的公钥都单独追加到authorized_keys
  • ssh-keygen -l -f id_rsa.pub检查密钥指纹是否匹配

问题4:服务器拒绝连接

  • 检查服务器/etc/ssh/sshd_config配置:
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    
  • 记得重启服务:sudo systemctl restart sshd

6. 高级技巧

6.1 密钥代理转发

在本地启动ssh-agent后台服务:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa  # 把密钥交给agent托管

然后在config文件添加:

Host *
  AddKeysToAgent yes
  ForwardAgent yes

这样在跳板机场景下,可以链式转发密钥认证。

6.2 安全加固建议

  • 定期轮换密钥(每3-6个月)
  • 在服务器限制IP白名单:
    # /etc/ssh/sshd_config
    AllowUsers devuser@192.168.1.*
    
  • 禁用密码登录(确保密钥可用后):
    PasswordAuthentication no
    

7. 跨平台注意事项

Windows系统

  • 建议使用Git Bash替代CMD
  • 如果遇到路径问题,试试转义反斜杠:
    IdentityFile C:\\Users\\yourname\\.ssh\\id_rsa
    

Mac/Linux

  • 可能需要修正密钥权限:
    chmod 400 ~/.ssh/id_rsa
    

团队协作

  • 用Ansible批量部署密钥:
    - name: Deploy SSH keys
      ansible.builtin.authorized_key:
        user: devuser
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    

这套方案在我们20人团队稳定运行三年,支持同时50+设备连接。刚开始可能会觉得配置繁琐,但一旦跑通,你会发现自己再也回不去密码登录的时代了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐