引言:为什么密码登录不够好?

使用密码通过SSH登录远程服务器,是大多数人的第一反应。但它存在两个主要问题:

  1. 不安全:密码可能会被猜到(弱密码)、被暴力破解(Brute-force attack),或者在不安全网络中被截获。一旦密码泄露,服务器就门户大开。
  2. 不方便:为了安全,你可能会设置一个非常复杂的长密码。但每次登录都要手动输入,非常繁琐,尤其是在需要频繁操作多台服务器时。

SSH密钥对认证提供了一种完美的解决方案。它基于非对称加密技术,由一对密钥组成:

  • 私钥 (Private Key): 存放在你的本地电脑上,必须像最高机密一样妥善保管,绝不能泄露。它相当于你的身份证明。
  • 公钥 (Public Key): 存放在你想要登录的远程服务器上。它可以被公开,不用担心泄露。它相当于一把锁。

当你尝试登录时,服务器会用你的公钥(锁)向你发一个“挑战”,只有你本地的私钥(唯一的钥匙)才能正确回应这个“挑战”。验证通过后,你就可以成功登录,全程无需输入密码。

步骤1:在本地电脑生成SSH密钥对

打开你本地电脑的终端(Windows用户可以使用Git Bash、WSL或PowerShell)。运行以下命令:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa: 指定密钥类型为RSA,这是最广泛使用的一种。
  • -b 4096: 指定密钥长度为4096位。长度越长越安全,4096位是目前推荐的强度。
  • -C "your_email@example.com": 添加一段注释,通常用你的邮箱来标识这个密钥是谁的。

按回车后,程序会问你几个问题:

  1. Enter file in which to save the key (...): 密钥保存位置。直接按回车,使用默认位置即可。默认位置通常是用户主目录下的.ssh文件夹(如 /Users/yourname/.ssh/id_rsaC:\Users\yourname\.ssh\id_rsa)。
  2. Enter passphrase (empty for no passphrase): 设置私钥的保护密码。强烈建议设置一个密码! 这相当于给你的私钥文件本身加了一层保险。即使你的私钥文件被盗,没有这个密码,小偷也无法使用它。输入密码时屏幕上不会显示,输完按回车,再输入一次进行确认。

命令执行成功后,你会在你的.ssh目录下找到两个新文件:

  • id_rsa: 你的私钥
  • id_rsa.pub: 你的公钥

步骤2:将公钥上传到远程服务器

现在,我们需要把“锁”(公钥 id_rsa.pub)放到服务器上。你有两种方法可以做到这一点。

方法A:使用ssh-copy-id命令(推荐,最简单)

如果你的本地电脑是macOS或Linux,或者Windows上安装了Git Bash/WSL,你可以使用这个便捷的命令。

ssh-copy-id username@your_server_ip
  • username: 你在远程服务器上的用户名。
  • your_server_ip: 远程服务器的IP地址或域名。

执行该命令时,它会要求你最后一次输入该服务器的登录密码。输入正确后,ssh-copy-id会自动将你的公钥内容,追加到服务器上~/.ssh/authorized_keys文件的末尾。

方法B:手动复制粘贴(通用方法)

如果你的本地环境没有ssh-copy-id命令(比如原生的Windows PowerShell),可以用这个手动方法。

  1. 在本地电脑上,查看并复制公钥内容

    cat ~/.ssh/id_rsa.pub
    

    用鼠标完整地复制屏幕上输出的那一长串以ssh-rsa开头、以你的邮箱结尾的文本。

  2. 通过密码登录到你的远程服务器

    ssh username@your_server_ip
    
  3. 在服务器上,将公钥内容追加到authorized_keys文件中。 运行以下命令。注意 >> 是追加重定向,不要写成 >,否则会覆盖整个文件!

    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    echo "在这里粘贴你刚刚复制的公钥内容" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
    • mkdir -p ~/.ssh: 确保.ssh目录存在。
    • chmod 700 ~/.ssh: 设置.ssh目录的权限,只有所有者能读写执行。
    • echo "..." >> ...: 将你的公钥粘贴到echo的引号内,然后追加到authorized_keys文件。
    • chmod 600 ...: 设置authorized_keys文件的权限,只有所有者能读写。这是非常重要的安全步骤,错误的权限会导致密钥登录失败!

步骤3:享受免密登录

完成以上步骤后,退出服务器。现在,再次尝试登录:

ssh username@your_server_ip

如果之前你为私钥设置了保护密码,系统会提示你输入passphrase。输入正确后,你就可以直接登录了,全程不再需要服务器的密码!

总结

配置SSH密钥登录是一次性的投入,但会带来长期的安全和便利。你不仅摆脱了记忆和输入繁琐密码的烦恼,更重要的是,通过禁用密码登录(可以在服务器的/etc/ssh/sshd_config文件中设置PasswordAuthentication no),可以极大地提升你服务器的安全性,有效抵御绝大多数的自动化攻击。这是每一个与远程服务器打交道的开发者的必备技能。