SSH 密钥认证:安全便捷的远程登录方式
SSH(Secure Shell)是 Linux 系统中远程登录的标准协议,除了传统的密码认证外,密钥认证机制提供了更安全、更便捷的登录方式,无需每次输入密码即可建立连接。本文将详细介绍 SSH 密钥认证的原理和配置方法。
密钥认证的工作原理
SSH 密钥认证基于非对称加密算法(如 RSA 或 ECDSA),通过一对密钥(公钥和私钥)实现身份验证:
- 密钥对生成:用户在本地生成一对密钥 —— 公钥(public key)和私钥(private key)。
- 公钥部署:将公钥上传到目标服务器的指定位置(
~/.ssh/authorized_keys
)。 - 认证过程:
- 客户端发起 SSH 连接请求。
- 服务器生成随机数,用客户端的公钥加密后发送给客户端。
- 客户端用私钥解密随机数,返回给服务器。
- 服务器验证结果,一致则允许登录。
优势:
- 安全性更高:私钥仅存于本地,无需在网络中传输密码。
- 便捷性:配置后无需重复输入密码,适合脚本自动化操作。
密钥认证的配置步骤
1. 在本地客户端生成密钥对
使用 ssh-keygen
命令生成密钥对(默认采用 RSA 算法):
1 | ssh-keygen -t rsa -b 4096 |
-t rsa
:指定加密算法为 RSA(可选ecdsa
、ed25519
等)。-b 4096
:指定密钥长度为 4096 位(安全性更高,默认 2048 位)。
交互过程:
1 | Generating public/private rsa key pair. |
生成后,在 ~/.ssh/
目录下会生成两个文件:
id_rsa
:私钥(重要!妥善保管,不可泄露)。id_rsa.pub
:公钥(可公开,用于部署到服务器)。
2. 将公钥上传到目标服务器
方法 1:使用 ssh-copy-id
自动部署(推荐)
1 | ssh-copy-id username@remote_host |
username
:目标服务器的用户名。remote_host
:服务器 IP 或域名。
该命令会自动将本地公钥(id_rsa.pub
)添加到服务器的 ~/.ssh/authorized_keys
文件中,并创建必要的目录和权限。
方法 2:手动上传公钥
若服务器不支持 ssh-copy-id
,可手动操作:
复制本地公钥内容:
1
cat ~/.ssh/id_rsa.pub
登录服务器,创建
.ssh
目录(若不存在):1
2
3ssh username@remote_host # 用密码登录
mkdir -p ~/.ssh
chmod 700 ~/.ssh # 确保目录权限正确(仅所有者可读写)将公钥内容追加到
authorized_keys
:1
2nano ~/.ssh/authorized_keys # 粘贴公钥内容,保存退出
chmod 600 ~/.ssh/authorized_keys # 确保文件权限正确退出服务器:
1
exit
3. 测试密钥登录
配置完成后,尝试登录服务器,无需输入密码即可连接:
1 | ssh username@remote_host |
若生成密钥时设置了 passphrase(密钥密码),首次登录会提示输入该密码(后续可通过 ssh-agent
缓存密码,避免重复输入)。
高级配置:增强安全性与便捷性
禁用密码登录(推荐)
为进一步提升安全性,可在服务器上禁用密码认证,仅允许密钥登录:
登录服务器,编辑 SSH 配置文件:
1
sudo nano /etc/ssh/sshd_config
修改以下配置:
1
2PasswordAuthentication no # 禁用密码认证
PubkeyAuthentication yes # 启用公钥认证(默认已开启)重启 SSH 服务使配置生效:
1
2
3
4
5# Ubuntu/Debian
sudo systemctl restart sshd
# CentOS/RHEL
sudo systemctl restart sshd
使用 config 文件简化登录
创建本地 ~/.ssh/config
文件,定义服务器别名和登录参数:
1 | nano ~/.ssh/config |
添加内容(示例):
1 | Host webserver |
保存后,可直接通过别名登录:
1 | ssh webserver # 等价于 ssh admin@192.168.1.100 |
管理多个密钥对
若需要连接多个服务器,可生成专用密钥对并指定使用:
1 | # 生成专用密钥对 |
常见问题解决
- 密钥登录失败:
- 检查服务器
~/.ssh/authorized_keys
是否包含本地公钥。 - 确保服务器
~/.ssh
目录权限为700
,authorized_keys
权限为600
。 - 查看服务器日志排查原因:
sudo tail -f /var/log/auth.log
(Ubuntu)或/var/log/secure
(CentOS)。
- 检查服务器
- 忘记密钥密码:
- 无法找回,需重新生成密钥对并重新部署公钥。
v1.3.10