如何解决您的Droplet上的SSH验证问题

本教程涵盖SSH身份验证问题。一旦连接建立并且协议被启动以安全地通信,则系统然后可以验证连接到系统的用户。这一层认证支持各种身份验证机制,但是这个演练将涵盖两个最常见的密码和密码密钥。

介绍

这是我们的SSH故障排除文章系列的延续

第一篇文章将帮助您确定何时解决问题,而不是迁移或重新部署问题,并为您需要有效地进行故障排除的信息提供资源。 本系列的其他部分包括如何识别和解决特定的SSH错误,并分解您需要调试成功的SSH连接的哪个阶段

一旦连接建立并且协议被启动以安全地通信,则系统然后可以验证连接到系统的用户。 支持各种认证机制。 这个演练将涵盖两个最常见的:密码和私钥/公钥对。

先决条件

要解决SSH问题,您需要确保您的Droplet正常从Web控制台正常响应,并使用正常的网络配置。 您可以通过遵循如何和什么时候解决SSH问题教程来执行此操作

在对SSH进行故障排除之前,您应该始终检查云计算面板,以了解影响您的Droplet的区域,管理程序状态以及通过Web控制台的Droplet状态的持续问题

错误

以下是您可能遇到的常见SSH身份验证错误。

权限被拒绝密码

注意:如果在创建Droplet时分配了SSH密钥,则您的Droplet将禁用PasswordAuthentication ,您将需要使用SSH密钥进行登录。

在尝试使用密码登录到Droplet时,您可能会在PuTTY和OpenSSH客户端中看到这些错误:

root@111.111.111.111's password: 
Permission denied (publickey,password).
root@111.111.111.111's password:
Access denied

Server sent disconnect message
type 2 (protocol error):
"Too many authentication failures for root"

这表示身份验证失败,可能是由一些问题引起的。 以下是您可以采取的一些步骤来解决此问题:

  • 确保您使用的是正确的用户名。 在CoreOS上,使用核心用户。 在FreeBSD上,使用freebsd用户。
  • 用户密码认证可能会损坏,因此请检查Droplet Web控制台是否支持密码登录。 如果没有,您将需要尝试重置密码请求恢复环境尝试恢复访问。
  • 检查服务器是否允许密码验证

权限被拒绝

此登录方法使用加密密钥来验证用户。 您可以在SSH Essentials教程中了解SSH密钥如何工作。

当使用SSH密钥创建Droplet时,这是唯一的身份验证方法。 一旦您使用SSH密钥成功登录,您可以在SSH服务配置文件中启用密码验证。

您可能会看到如下错误:

Permission denied (publickey).
Disconnected: No supported authentication methods available (server sent: publickey)

关于基于密钥的身份验证的许多常见问题是由文件权限或所有权不正确导致的。 以下是您可以采取的一些步骤来解决此问题:

密码在控制台中不起作用

如果您无法恢复对控制台的访问,则可能会指示影响PAM子系统中的身份验证机制或配置问题的文件系统问题。 这也将影响重置Droplet的密码并通过控制台登录的尝试。

您可以从控制台看到此登录提示:

Ubuntu 14.04.4 LTS server tty1
server Login:
Password:

但是当您输入正确的密码时,您可能会收到以下错误:

Login incorrect

密码重置后 ,您会收到以下提示:

You are required to change your password immediately (root enforced)
Changing password for root.
(Current) UNIX Password:

您必须重新输入当前密码。 如果您的连接立即关闭,那么您可能会错误地重新输入当前密码,请重试。

成功后,系统会提示您输入两次新密码:

Enter new UNIX password: 
Retype new UNIX password:

但是,如果在两次重新启动会话后输入相同的新密码(即,您将被重新发送回提示进行登录),或者看到错误,则通常意味着管理中使用的关键文件之一存在问题您的身份验证数据。

在这种情况下,您将考虑使用恢复环境来准备数据以便重新部署或尝试解决PAM配置或文件系统的问题。

解决方案

以下是常见的SSH身份验证错误的一些故障排除方法和解决方案。

检查可用的身份验证方法

如果您使用详细的SSH客户端输出或日志记录,请检查列出身份验证方式的消息是否包含password和/或publickey

debug1: Authentications that can continue: publickey,password

如果消息不包含要使用的身份验证方法,请查看/etc/ssh/sshd_config配置文件。 当以root身份 without-password时,将PasswordAuthentication值意外设置为yesPermitRootLoginnono without-password是一个常见错误。

确保为登录方法设置了适当的配置,然后重新启动该服务。

确定关键权限和所有权

OpenSSH服务器和客户端对所使用的密钥文件需要严格的权限

主机和客户端都应具有以下权限和所有者:

  • ~./ssh权限应该是700
  • ~./ssh应由您的帐户拥有
  • ~/.ssh/authorized_keys权限应为600
  • ~/.ssh/authorized_keys应由您的帐户所有

客户端环境还应具有以下权限和所有者:

  • ~/.ssh/config权限应为600
  • ~/.ssh/id_ *权限应为600

这些更改可能需要通过Droplet Web控制台进行

检查SSH公钥和私钥

如果您忘记了哪个私钥匹配哪个公钥,OpenSSH工具和PuTTY应用程序提供了一种从私钥生成公钥的方法。 您可以使用它来比较您的Droplet上的~/.ssh/authorized_keys文件的内容。

要从OpenSSH环境中的私钥ssh-keygen公钥,请使用ssh-keygen命令,如下所示,指定私钥的路径。 默认情况下是~/.ssh/id_rsa

ssh-keygen -y -f ~/.ssh/id_rsa

这将生成一个公共密钥,如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfBiMwCU1xoVVp0VbSYV3gTDV/jB57IHdILQ8kJ2622//Lmi4gDPlxA6HXVKq8odkGD/5MjqUw85X2rwEbhoBul74+LCToYJvvvBaDPCgg5z1icCKIJ1m/LJBrGNqPKCgqFWu0EH4/EFP2XIQqWqX1BZtJu/2YWrTr+xFOE/umoYmOd+t3dzQqMsv/2Aw+WmA/x/B9h+41WrobDgCExYNLPYcD0PO7fpsa8CcrZCo+TUWCe7MgQQCSM6WD4+PuYFpUWGw3ILTT51bOxoUhAo19U8B2QqxbMwZomzL1vIBhbUlbzyP/xgePTUhEXROTiTFx8W9yetDYLkfrQI8Q05+f

在PuTTY环境中, PuTTYgen.exe命令将加载GUI,您可以使用“ 加载”操作导入私钥文件。 在PuTTY中,通常以.ppk格式存储,您需要知道文件的位置。

导入密钥后,该窗口将包含一个公钥,用于粘贴OpenSSH authorized_keys文件部分,具有相似的顺序。 如果您选择该文本并将其粘贴到文件中,它将折叠它显示的+字符,并产生公钥。

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfBiMwCU1xoVVp0VbSYV3gTDV/jB57IHdILQ8kJ2622//Lmi4gDPlxA6HXVKq8odkGD/5MjqUw85X2rwEbhoBul74+LCToYJvvvBaDPCgg5z1icCKIJ1m/LJBrGNqPKCgqFWu0EH4/EFP2XIQqWqX1BZtJu/2YWrTr+xFOE/umoYmOd+t3dzQqMsv/2Aw+WmA/x/B9h+41WrobDgCExYNLPYcD0PO7fpsa8CcrZCo+TUWCe7MgQQCSM6WD4+PuYFpUWGw3ILTT51bOxoUhAo19U8B2QqxbMwZomzL1vIBhbUlbzyP/xgePTUhEXROTiTFx8W9yetDYLkfrQI8Q05+f imported-openssh-key

您可以忽略公钥(这是imported-openssh-key )后的注释,因为它可能与您生成的密钥注释不同。

在这两种情况下,请确保该服务器上的~/.ssh/authorized_keys文件中包含该公钥,并将其添加。

OpenSSH 7和已弃用的关键算法

在使用OpenSSH 7(默认情况下为FreeBSD和CoreOS)的系统上,任何旧的基于DSA的密钥将不被认证支持。 ssh-dss密钥被认为是弱的,强烈建议使用更现代的密钥算法。

因此,最好的解决方案是生成更多现代密钥,并更新现有主机以允许新的密钥。 但是,作为解决方法,您可以在/etc/ssh/sshd_config文件PubkeyAcceptedKeyTypes指令设置为+ssh-dss

结论

有关成功设置基于密钥的身份验证的步骤,以下指南是伟大的参考:

如果您需要通过SSH进一步的帮助认证,您可以与我们的支持团队打开一张机票 确保包括:

  • 用于连接的用户名,主机和端口
  • 您希望使用的身份验证机制
  • 全部输出的错误链接到错误阶段,包括SSH客户端的详细输出
  • 目前为止您从故障排除收集的所有信息
  • 在引用这篇文章时,你不清楚什么

包括所有上述诊断信息,并澄清您在尝试连接时遇到问题的位置,可以帮助我们快速加快您在需要时遇到问题的速度。