引言:为什么密码登录不够好?
使用密码通过SSH登录远程服务器,是大多数人的第一反应。但它存在两个主要问题:
- 不安全:密码可能会被猜到(弱密码)、被暴力破解(Brute-force attack),或者在不安全网络中被截获。一旦密码泄露,服务器就门户大开。
- 不方便:为了安全,你可能会设置一个非常复杂的长密码。但每次登录都要手动输入,非常繁琐,尤其是在需要频繁操作多台服务器时。
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"
: 添加一段注释,通常用你的邮箱来标识这个密钥是谁的。
按回车后,程序会问你几个问题:
Enter file in which to save the key (...)
: 密钥保存位置。直接按回车,使用默认位置即可。默认位置通常是用户主目录下的.ssh
文件夹(如/Users/yourname/.ssh/id_rsa
或C:\Users\yourname\.ssh\id_rsa
)。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),可以用这个手动方法。
-
在本地电脑上,查看并复制公钥内容。
cat ~/.ssh/id_rsa.pub
用鼠标完整地复制屏幕上输出的那一长串以
ssh-rsa
开头、以你的邮箱结尾的文本。 -
通过密码登录到你的远程服务器。
ssh username@your_server_ip
-
在服务器上,将公钥内容追加到
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
),可以极大地提升你服务器的安全性,有效抵御绝大多数的自动化攻击。这是每一个与远程服务器打交道的开发者的必备技能。
...