SSH密钥认证是比传统密码更安全、高效的远程服务器登录方式,用非对称加密技术在客户端生成一对数学上关联的密钥:私钥和公钥。其中私钥是由用户保管,公钥可以放置在要登录的服务器上。认证时,服务器用公钥发起挑战,客户端用私钥应答以证明身份。这种方法彻底避免了密码在传输中被拦截或遭受暴力破解的风险,同时支持自动化脚本的无干预登录。
生成密钥对是使用密钥登录的第一步,在客户端计算机上完成。最常用的工具是`ssh-keygen`,它通常随SSH客户端(如OpenSSH)一起安装。
打开终端(Linux/macOS)或PowerShell(Windows 10及以上),执行命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
或使用传统的RSA算法:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
`-t ed25519` 指定密钥类型。Ed25519在安全性和性能上通常优于RSA,是现代系统的首选。如果服务器较旧可能不支持,则可选择 `-t rsa`。
`-b 4096` 指定RSA密钥的位长度为4096位,低于2048位的密钥目前被认为不够安全。
`-C` 后跟的注释,通常是邮箱,用于标识密钥,可留空。
执行命令后,程序会交互式地提示:
1. 保存密钥的文件路径:按回车接受默认路径(`~/.ssh/id_ed25519` 或 `~/.ssh/id_rsa`)。为避免覆盖现有密钥,也可指定其他路径。
2. 设置密钥密码:为私钥设置一个密码是重要的安全实践。即使私钥文件意外泄露,攻击者仍需要此密码才能使用它。输入密码时屏幕无显示,直接输入后回车即可。如果确实无需密码保护,可直接回车留空。
命令执行成功后,将在 `~/.ssh/` 目录下生成两个文件:
`id_ed25519`(或 `id_rsa`):私钥文件。权限必须是600(仅所有者可读写),这是SSH客户端的强制要求。其内容必须严格保密,绝不传输给他人或服务器。
`id_ed25519.pub`(或 `id_rsa.pub`):公钥文件。内容为一长串文本,由算法类型、公钥本身和注释组成。这是需要部署到服务器的部分。
可以使用 `cat ~/.ssh/id_ed25519.pub` 命令查看并复制公钥内容。
生成密钥对后,需要将公钥安装到目标SSH服务器的相应用户目录下,服务器才能识别并接受该密钥。
标准手动部署方法:首先,使用密码SSH登录到目标服务器:
ssh username@server_ip
在服务器的用户家目录下,确保存在 `.ssh` 目录,权限应为700:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
将客户端的公钥内容追加到服务器的 `~/.ssh/authorized_keys` 文件中。可以直接编辑该文件粘贴,或使用 `echo` 命令:
echo "粘贴您的公钥完整内容" >> ~/.ssh/authorized_keys
关键一步是设置 `authorized_keys` 文件的权限为600:
chmod 600 ~/.ssh/authorized_keys
权限设置过松(如其他人可写)会导致SSH服务器出于安全考虑拒绝使用该文件。
使用自动化工具部署比如OpenSSH提供了一个便捷工具
ssh-copy-id
可自动完成上述步骤。
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server_ip
执行此命令时,会提示输入用户密码,之后工具会自动处理目录创建、文件追加和权限设置。这是最推荐的方法,能有效避免手动操作失误。
公钥部署成功后,即可开始使用密钥登录。基本的连接命令与密码登录相同:
ssh username@server_ip
此时,SSH客户端会自动尝试使用默认路径(`~/.ssh/id_rsa` 或 `~/.ssh/id_ed25519`)的私钥进行认证。如果连接成功且无需输入用户密码,则说明密钥登录已配置成功。
处理非默认情况是使用了自定义路径或名称的私钥:需要通过 `-i` 选项显式指定私钥文件路径:
ssh -i /path/to/your/private_key username@server_ip
私钥设置了密码:客户端会在连接时提示输入私钥密码。为方便起见,可以使用 `ssh-agent` 管理私钥密码。在会话开始时运行 `eval "$(ssh-agent -s)"` 启动代理,然后用 `ssh-add ~/.ssh/id_ed25519` 添加私钥并输入一次密码,此后在该会话中再次使用该私钥便无需重复输入密码。
创建客户端配置文件简化连接是对于需要经常连接、参数复杂的服务器,可以在客户端的 `~/.ssh/config` 文件中创建别名。例如,添加如下配置:
Host myserver
HostName server_ip_or_domain
User username
IdentityFile ~/.ssh/id_ed25519
Port 2222 # 如果SSH服务不在默认的22端口
之后,只需执行 `ssh myserver` 即可自动使用所有预设参数连接,无需记忆和输入繁琐的命令行选项。
在确保密钥登录稳定工作后,应采取进一步措施加固安全。彻底禁用密码登录(可选但强烈推荐)编辑服务器上的SSH服务配置文件 `/etc/ssh/sshd_config`,找到并修改以下行:
PasswordAuthentication no
PubkeyAuthentication yes
修改后,重启SSH服务使配置生效(如 `sudo systemctl restart sshd`)。务必在确认密钥登录完全成功后再进行此操作,否则可能导致自己无法登录。
管理服务器上的多个公钥`authorized_keys` 文件可以包含多个公钥,每行一个。如需撤销某个客户端的访问权限,只需删除该客户端对应的公钥行即可。定期审计此文件是良好的安全习惯。
如果连接时遇到“Permissions are too open”或“Bad permissions”错误,说明客户端私钥或服务器上 `.ssh` 目录及内部文件的权限设置不正确。务必确保:客户端私钥文件权限为 `600`;客户端 `.ssh` 目录权限为 `700`;服务器端 `.ssh` 目录权限为 `700`;服务器端 `authorized_keys` 文件权限为 `600`;使用 `ls -la` 命令检查权限,并使用 `chmod` 命令修正。
综上所述,SSH密钥登录的部署是一个从本地生成密钥对开始,到将公钥部署至服务器,最后测试并优化连接的清晰流程。正确配置后,它不仅提供了比密码更强大的安全保障,还带来了操作上的便利。
相关内容
