Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
当我尝试通过 SSH 连接到 EC2 实例时,为什么会收到“Server refused our key”(服务器拒绝了我们的密钥)错误消息?
当我通过 SSH 连接到 Amazon Elastic Compute Cloud (Amazon EC2) 实例时,我收到“Server refused our key”(服务器拒绝了我们的密钥)错误。
解决方法
SSH 服务器 (sshd) 可能会因以下原因之一而拒绝 SSH 私钥:
- 您在连接到 Amazon EC2 实例时使用了错误的私钥文件。要解决此问题,请参阅为什么我在连接到 Amazon EC2 Linux 实例时收到“imported-openssh-key”或“PuTTY Fatal Error”(PuTTY 致命错误)错误?
- 有人修改了 /etc/ssh/sshd_config 中的 SSH 服务器设置。要解决此问题,请参阅更改实例的 sshd_config 文件后,如何使用 SSH 访问我的 EC2 实例?
- 操作系统 (OS) 无法挂载 /etc/fstab 主目录。要解决此问题,请参阅为什么在尝试启动 EC2 Linux 实例时,它会进入紧急模式?
- 您在连接到 Amazon EC2 实例时对亚马逊机器映像 (AMI) 使用了错误的用户名。有关有效用户名的列表,请参阅“错误: 服务器拒绝了我们的密钥_”或 _No supported authentication methods available。
- 有人从服务器中删除了用户。要解决此问题,请将该用户作为新用户添加回服务器。
如果您的实例存在权限问题或缺少目录,您可能还会收到 Server refused our key(服务器拒绝了我们的密钥)错误消息。要验证您的实例权限和目录,请使用以下方法之一。
使用 EC2 Serial Console
如果您激活了适用于 Linux 的 EC2 Serial Console,则可以使用串行控制台对支持的基于 Nitro 的实例类型进行故障排除。
使用 Systems Manager 登录实例并检查权限
先决条件:安装 AWS Systems Manager Agent (SSM Agent)。此外,请确保您的配置符合会话管理器(AWS Systems Manager 的一项功能)的先决条件。
要使用会话管理器对您的实例进行故障排除,请完成以下步骤:
-
启动会话。
-
要确保主目录下的文件具有正确的权限,请运行以下命令:
stat /home/ec2-user/ ls -ld /home # Should show drwxr-xr-x (755) ls -ld /home/ec2-user # Should show drwx------ (700) ls -ld /home/ec2-user/.ssh # Should show drwx------ (700) ls -l /home/ec2-user/.ssh/authorized_keys # Should show -rw------- (600)
**注意:**请将 ec2-user 替换为您的 AMI 的正确用户名。
在输出中,检查 Access(访问权限),以确保您的配置使用以下权限:
/home Linux 主目录必须具有 0755/drwxr-xr-x 权限。
/home/ec2-user/ 用户的主目录必须具有 0700/drwx------ 权限。
/home/ec2-user/.ssh .ssh 目录权限必须具有 0700/drwx------ 权限。
/home/ec2-user/.ssh/authorized_keys authorized_keys 文件权限必须具有 0600/-rw------- 权限。
示例输出:File: '/home/ec2-user/' Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 10301h/66305d Inode: 18322 Links: 3 Access: (0700/drwx------) Uid: ( 500/ec2-user) Gid: ( 500/ec2-user)
-
要更新配置的权限,请运行以下命令:
sudo chown root:root /home$ sudo chmod 755 /home$ sudo chown ec2-user:ec2-user /home/ec2-user -R sudo chmod 700 /home/ec2-user /home/ec2-user/.ssh sudo chmod 600 /home/ec2-user/.ssh/authorized_keys
**注意:**请将 ec2-user 替换为您的 AMI 的正确用户名。
-
结束会话。
运行 AWSSupport-TroubleshootSSH 运行手册
要自动更正导致错误的问题,请运行 AWSSupport-TroubleshootSSH。该运行手册会在实例上安装 Amazon EC2Rescue 工具,然后识别并更正导致 SSH 远程连接错误的问题。有关详细信息,请参阅我在尝试使用 SSH 连接我的 EC2 实例时收到错误。如何使用 AWSSupport-TroubleshootSSH 自动化工作流程解决 SSH 连接问题?
使用用户数据修复实例的权限
**重要事项:**在停止并启动实例之前,请执行以下操作:
- 创建您的 Amazon Elastic Block Store (Amazon EBS) 卷的备份。
**注意:**如果您的实例是由实例存储支持,或者具有包含数据的实例存储卷,则 Amazon EC2 会在实例停止时删除这些数据。如果实例的根设备是实例存储卷,则无法使用用户数据更改 SSH 密钥。 - 完成解决步骤后,暂时将该实例从其 Amazon EC2 Auto Scaling 组中移除。
**注意:**如果您停止 EC2 Auto Scaling 组中的实例,则可以根据缩容保护设置终止该实例。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能位于 Auto Scaling 组中。 - 将实例关闭行为设置为 Stop(停止),以确保实例在您停止时不会终止。
- 安装和配置 cloud-init。有关详细信息,请参阅 cloud-init 网站上的 Configure SSH and SSH keys。
**重要事项:**对实例的用户数据的更新会影响所有支持 cloud-init 命令的发行版。
**注意:**当停止并启动某个实例时,该实例的公共 IP 地址将发生变化。最佳实践是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。如果您使用的是 Amazon Route 53,则在公共 IP 地址发生变化时可能需要更新 Route 53 DNS 记录。
要使用用户数据修复权限问题,请完成以下步骤:
-
打开 Amazon EC2 控制台。
-
在导航窗格中,选择 Instances(实例),然后选择您的实例。
-
选择 Instance state(实例状态),然后选择 Stop Instance(停止实例)。
**注意:**如果您无法选择 Stop instance(停止实例),则表明该实例已停止,或者其根设备是实例存储卷。 -
选择 Actions(操作),然后选择 Instance settings(实例设置)。
-
选择 Edit user data(编辑用户数据),然后输入以下命令:
Content-Type: multipart/mixed; boundary="//"MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [scripts-user, always] --//Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash chown root:root /home chmod 755 /home chown ec2-user:ec2-user /home/ec2-user -R chmod 700 /home/ec2-user /home/ec2-user/.ssh chmod 600 /home/ec2-user/.ssh/authorized_keys --//
**注意:**请将 ec2-user 替换为您的 AMI 的正确用户名。输入上述命令时请不要添加额外的空格。
-
选择 Save(保存)。
-
启动实例,然后使用 SSH 连接到实例。
默认情况下,用户数据命令对于每个实例运行一次。上述步骤会更改默认行为,会在实例每次重启、停止或启动时添加公钥。要恢复默认行为,请删除自定义用户数据命令。最佳做法是允许用户数据在实例首次启动后运行。您可以使用 ModifyInstanceAttribute API 来修改实例的用户数据。要限制对 ModifyInstanceAttribute API 的访问,请使用 AWS Identity and Access Management (IAM) 策略。
相关信息
如何解决使用 SSH 连接到 Amazon EC2 Linux 实例时出现的问题?
当我尝试通过 SSH 连接到 EC2 实例时,为什么会收到“Server refused our key”(服务器拒绝了我们的密钥)错误?
