替换EC2实例authorized_keys公钥后仍可通过旧密钥访问的问题
关闭SSH连接复用会话
若之前开启了SSH连接复用(比如本地~/.ssh/config里配置了ControlMaster yes),已建立的连接会保持活跃状态,即使服务器端替换了密钥,复用的旧连接依然能正常访问。执行以下命令关闭复用连接:ssh -O exit user@your-ec2-instance-ip或者直接退出所有当前登录的SSH会话,再尝试用旧密钥登录验证是否失效。
修正authorized_keys文件权限
sshd对密钥文件的权限要求严格,权限过松会导致sshd忽略该文件,继续使用缓存的认证信息。执行以下命令修复权限:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys同时确认你修改的是当前登录用户的对应文件——比如用root登录时,路径是
/root/.ssh/authorized_keys,而非普通用户的/home/xxx/.ssh/authorized_keys。确认sshd读取的密钥文件路径
部分系统会修改sshd配置中的AuthorizedKeysFile参数,导致sshd读取的不是你修改的文件。执行以下命令查看实际生效的路径:sudo sshd -T | grep authorizedkeysfile如果输出路径与你修改的文件不符,找到对应文件并替换其中的旧密钥。
检查额外的授权密钥文件
有些系统会在/etc/ssh/authorized_keys.d/目录下存放额外的授权密钥,或者sshd配置中指定了多个密钥文件路径。检查这些位置是否残留旧密钥:sudo ls /etc/ssh/authorized_keys.d/若存在相关文件,打开删除其中的旧公钥即可。
使用正确的命令重启sshd服务
不同系统的sshd重启命令不同,确保执行的是对应系统的正确命令:- 基于systemd的系统(如Amazon Linux 2、Ubuntu 16.04+):
sudo systemctl restart sshd - 基于init的系统:
sudo service sshd restart
重启后可通过
sudo systemctl status sshd(systemd)或sudo service sshd status(init)确认服务已正常重启。- 基于systemd的系统(如Amazon Linux 2、Ubuntu 16.04+):
清理本地SSH-agent缓存
虽然服务器端已替换密钥,但本地SSH-agent可能缓存了旧私钥(这种情况服务器本应拒绝登录,但可排查尝试)。执行以下命令清空缓存:ssh-add -D之后仅添加新私钥:
ssh-add ~/.ssh/new_private_key_file
内容的提问来源于stack exchange,提问作者Giuseppe87

