即使将公钥添加到 authorized_keys 也无法 ssh

Jef*_*eff 19 ssh networking 16.04

我有一个 Digital Ocean Droplet,我正试图让自己通过 ssh 访问。我不确定之前对它做了什么。我试过通过 Digital Ocean UI 添加我的公钥。那没有用,我一直得到permission denied (publickey)

我通过数字海洋控制台访问服务器并手动将我的公钥添加到/root/.ssh/authorized_keys. 然后我尝试 ssh 使用ssh root@x.x.x.x. 这不起作用(权限被拒绝)。

所以我尝试添加一个新用户,创建/home/me/.ssh目录的权限700.ssh目录本身,并600authorized_keys文件中。然后我尝试了ssh me@x.x.x.x。那也没有用。

重新启动 ssh 守护进程也不会改变任何东西。

我错过了什么?

编辑:

这是详细的 ssh 输出。

https://gist.github.com/jaesung2061/a37cfd68308414cede8abf7f0137daa9

编辑2:

LogLevel DEBUG3 输出:

在此处输入图片说明

ear*_*Lon 26

客户端配置

设置 ~/.ssh/config

为 设置主机条目ssh非常简单,可以为您省去很多麻烦。下面是一个例子:

Host digitaloceanbox
Hostname 111.111.111.111
User root
PubKeyAuthentication yes
IdentityFile /home/user/.ssh/digitalocean-rsa
ForwardX11 yes


Host github github.com
Hostname github.com
User git
PubKeyAuthentication yes
IdentityFile /home/user/.ssh/github-rsa
ForwardX11 no
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们建立digitaloceanboxgithubgithub.com,使我们可以做下面的命令:

  1. ssh github
  2. ssh digitaloceanbox

如果我们想以与配置文件中指定的用户不同的用户身份登录,我们只需放在开头user@

  • ssh user@digitaloceanbox

生成ssh密钥

ssh-keygen -t rsa -b 4096 -C user@homemachine
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):  /home/user/.ssh/digitalocean-rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/digitalocean-rsa
Your public key has been saved in /home/user/.ssh/digitalocean-rsa.pub.
The key fingerprint is:
SHA256:p9PYE/tveF2n//bLbp3ogYDtMtYEC5ziQiPxeob6fbo user@homemachine
Run Code Online (Sandbox Code Playgroud)

请注意,我已经指定了在提示时要生成的私钥的完整路径ssh-keygen。我还定义了注释 ( -C),它允许我轻松识别远程机器上的键。

这将创建两个文件:

  1. .ssh/digitalocean-rsa
    • 私人密钥。 永远不要分享这个
  2. .ssh/digitalocean-rsa.pub
    • 公钥。这是您存储在服务器上以进行身份​​验证的内容。

当您提供ssh密钥时,请确保它是.pub版本!!添加到您的 时~/.ssh/config,请确保添加与您添加到系统的公钥匹配的正确私钥。


服务器配置

大多数安装都将启用公钥身份验证。但是,如果您开始做事无所事事,您可能会遇到一些问题。在 OP 遇到问题的地方,我建议 OP 删除/root/.ssh/目录以重新开始。

不建议您使用sshroot 用户访问远程系统。建议您ssh切换到另一个用户,然后使用您的密码 ( sudo su -)升级到 root 。

使用添加密钥到主机 ssh-copy-id

无论您决定创建另一个用户并ssh作为该用户或 root 用户使用,以下都是将ssh密钥放置在服务器上的推荐方法:

  1. ssh-copy-id -i /home/user/.ssh/digitalocean-rsa.pub user@digitaloceanbox

这允许sshd使用所需的权限创建所需的目录和文件。这意味着您搞乱权限或需要记住细节的可能性为零。只需使用该工具上传密钥。

禁用密码验证

话虽如此,一旦您自己设置了密钥并验证您可以使用密钥进行连接,建议您禁用密码身份验证sshd并重新启动服务:

  1. 编辑 /etc/ssh/sshd_config
  2. PasswordAuthentication no
  3. sudo systemctl restart sshd

新用户呢?

如果禁用密码身份验证,您如何为新用户设置密钥?一种方法是将模板文件添加到/etc/skel目录中。锁定一位用户后,请执行以下操作:

  1. sudo cp -r .ssh/ /etc/skel/
  2. ls /etc/skel/.ssh
  3. 编辑找到的任何文件,/etc/skel/.ssh/使它们为空,除非您想为每个新创建的用户自动键入自己的密钥。

当您使用 来创建新用户时sudo useradd -m newuser,该用户将拥有.ssh/authorized_keys,您可以对其进行编辑并拥有适当的权限。

调试

您可以查看sshd日志文件以了解连接失败或被拒绝的原因:

  1. sudo tail -f /var/log/auth.log

运行此命令时,请使用另一个终端尝试登录。很多时候提供的消息足以帮助查明问题或在线找到解决方案。

  • 调试步骤对我有用。根目录权限错误(需要700) (2认同)

alb*_*t j 22

ssh 对使用 ssh 密钥的所有权、文件和目录权限非常挑剔。

~/.ssh/ 应该归所有者所有并拥有 700 权限。~/.ssh/authorized_keys 应该归所有者所有并且有 600 个权限。

所以,对于 root :

sudo chown root:root -R /root/.ssh/
sudo chmod 700 /root/.ssh/
sudo chmod 600 /root/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

对于用户我:

sudo chown me:me -R /home/me/
sudo chmod 700 /home/me/.ssh/
sudo chmod 600 /home/me/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

然后再试一次。

当然,您还应该检查 /etc/ssh/sshd_config 是否完全允许 ​​root 登录,或者只允许使用 ssh 密钥登录。

如果你有 :

PasswordAuthentication no
Run Code Online (Sandbox Code Playgroud)

然后你可以设置:

PermitRootLogin yes
Run Code Online (Sandbox Code Playgroud)

然后重新启动 sshd :

/etc/init.d/sshd restart
Run Code Online (Sandbox Code Playgroud)

然后再试一次。

请注意,使用 ssh,即使为此使用 ssh 会话,也可以重新启动 sshd 守护程序。Openssh 旨在解决此问题。

查看您上传的日志文件片段,您似乎使用的是 MacOSX ?你能在那里创建一个新的 ssh 密钥吗?

此外,我在过去发现,当我的本地计算机上有多个私有 ssh 密钥供我的用户使用时,这有时会导致无法使用 ssh 远程登录。在本地计算机上的 ~/.ssh/config 文件中输入条目对解决此问题有很大帮助。例如 :

Host my-vps
  HostName my-vps-ip-address-here
  IdentityFile ~/.ssh/id_rsa-my-private-key-location
  User my-username-here
Run Code Online (Sandbox Code Playgroud)

之后在本地计算机上的命令行上尝试:

ssh -v my-vps
Run Code Online (Sandbox Code Playgroud)

当使用 ssh 密钥,以及其他一些登录不使用 ssh 密钥时,除了使用 ssh 密钥的条目外,您还可以在 ~/ssh/config 文件中定义不使用 ssh 密钥的 ssh 登录,例如:

Host pi
  Hostname 192.168.1.111
  Port 22
  User pi
  PasswordAuthentication yes
  PreferredAuthentications password
Run Code Online (Sandbox Code Playgroud)

这对我来说很好用。也可以定义在命令行上使用哪个键:

ssh -v root@10.111.111.254 -i .ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

这可能会使调试更容易,并且在命令行上这应该始终在本地计算机上工作。

  • 除了这个解决方案之外,我还必须更改我的主文件夹的权限,以使 SSH 正常工作:`sudo chmod 700 /home/me/` (2认同)

小智 5

仔细检查 ssh 守护进程配置(应位于/etc/ssh/sshd_config)并检查:

PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

另请检查配置文件以查看是否已设置AllowUsersAllowGroups,因为它们分别充当用户和组的白名单。

另外,我注意到您正在尝试向根用户添加密钥。默认情况下,应禁用 root 登录,但您也可以通过PermitRootLogin字段更改此设置。


Jef*_*eff 4

我最终重新安装openssh-server解决了这个问题。给出的解决方案都很棒,但它们对我不起作用。我不知道是什么导致了这个问题,但我认为以前的开发人员可能搞乱了配置,把事情搞得非常糟糕。

我怀疑是否有人会遇到像我这样的具体问题。但是,如果您有 Digital Ocean Droplet,则无法获得 SSH 访问权限,并且给定的解决方案都不起作用,请通过 Digital Ocean 控制台运行这些命令来重新安装 SSH 服务器。请注意,这是一个破坏性过程,会删除/etc/ssh/(而不是您的.ssh目录)中的旧配置文件。

apt-get purge openssh-server
apt-get autoremove
apt-get autoclean
apt-get install openssh-server
Run Code Online (Sandbox Code Playgroud)

假设您的 ssh 客户端/密钥正常,您应该能够通过 SSH 连接到您的服务器。