即使使用 SSH 密钥,没有密码也无法登录

即使使用 SSH 密钥,没有密码也无法登录

我在 2 个不同的主机上有 2 个 shell 帐户:

  • shell A: shell 我想使用 SSH 密钥登录 (server-A.com)
  • shell B:我用来登录 A 的 shell,无需密码,但使用 SSH 密钥 (server-B.com)

我给 server-A.com 系统管理员发了电子邮件,他给了我以下教程 URL。

我做了以下事情:

  • 使用在 server-A.com 上创建私钥/公钥 SSH 密钥,并将私钥放在 server-B.com 上ssh-keygen -t rsa -C [email protected]~/.ssh/server-B.com
  • 我跑了chmod 700 ~/.ssh/然后chmod 600 ~/.ssh/server-B.com
  • 我将 server-A.com 公钥添加到~/.ssh/authorized_keysserver-B.com 上

    $ cat ~/.ssh/server-B.com.pub >> ~/.ssh/authorized_keys     # on server-B.com
    
  • 我已经检查过~/.ssh/config(否)并且/etc/ssh/ssh_config其中包含以下内容(未打印其他#注释行)

    #   PasswordAuthentication yes
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes
    

    来自外壳 B:

    $ ssh-keygen -f "/home/username/.ssh/known_hosts" -R server-A.com
    

笔记:我按照教程进行操作https://kb.iu.edu/d/aewshttps://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/create-with-openssh/

什么地方出了错?

答案1

您只需要私钥即可B登录A。不要在远程A系统上生成密钥。远程系统不需要知道您的私人身份。

您想要A从 登录系统B。这意味着~/.ssh/authorized_keys A系统上应包含公钥(以允许您输入)。系统B在本地不需要此文件来登录A

请注意,您必须确保~/.ssh两台主机上的 都具有700权限,并且其中的文件具有600权限(包括~/.ssh/authorized_keyson A)。

另外,实际上使用~/.ssh/server-B.comB登录文件中的密钥A,您必须使用sshas

ssh -i ~/.ssh/server-B.com  [email protected]

或者,启动ssh-agent并添加密钥:

eval "$( ssh-agent )"
ssh-add ~/.ssh/server-B.com

ssh [email protected]

或者,在系统中添加一个~/.ssh/config条目BA例如

Host A
    User a-user
    Hostname server-A.com
    IdentityFile %d/.ssh/server-B.com

然后使用

ssh A

您也可以只使用默认密钥文件的名称,除非您已有其他私钥。

答案2

好吧,你并没有全部搞错,只是部分搞错了。

要在 SSH 中通过公钥(加密)使用客户端身份验证:

  • 您必须拥有私钥文件客户- 您的B。

    最佳实践是产生客户端上的密钥。不推荐您所做的,在服务器上生成并复制,但会起作用。

    最佳实践是在客户端上使用标准文件名(取决于“类型”又名算法)——~/.ssh/id_rsa对于 RSA(v2 中)、~/.ssh/id_ecdsaECDSA 等,ssh-keygen如果在客户端上运行,则默认情况下会执行此操作。像您一样使用不同的名称意味着您必须在每次运行时指定文件名ssh,例如ssh -i ~/.ssh/server-B.com user@host [command...],或者设置您的配置文件以将其指定为您的IdentityFile(全局或特定主机)。

    其他用户必须无法访问私钥文件。 AFAICS 你chmod说得对。

  • 你把公钥放在~/.ssh/authorized_keysON THE服务器——你的A。

    使用cat >>通常很好,因为它保留任何现有内容并附加新行。如果存在(您确定)已过时的现有行(对于不再使用或授权的密钥或用户),您可能需要删除它们以保持整洁,但这不是必要的。

    并且该authorized_keys文件必须不能被其他用户写入。这可能是也可能不是您系统上的默认设置;如果没有,请chmod按照与密钥文件相同的方式使用。

  • known_hosts仅当以下情况时才需要从客户端 (B) 上的文件中删除服务器 (A) 的条目:服务器密钥已更改或已废弃。它与客户端身份验证无关。不必要地这样做,如果您在下次询问时不小心手动检查服务器密钥指纹,可能会为攻击者拦截、窃取和更改您的数据提供机会。

因此,如果您修复authorized_keys服务器 (A) 并ssh -i ~/.ssh/server-B.com user@serveraname在客户端 (B) 上运行,并且如果要求验证服务器指纹,则它应该可以工作。如果没有,请-v按照 Haxiel 的评论运行多个选项以获取详细信息。特别是如果它似乎没有看到指定的密钥文件(又名身份文件),请使用 重新检查权限ls -l

答案3

主机上的文件 /etc/ssh/sshd_config 中应该有一个公钥身份验证选项。取消注释并设置为 yes

确保您正在主机上编辑 /etc/ssh/sshd_config,而不是 /etc/ssh/ssh_config。第二个文件仅供客户使用

如果需要,请联系主机A的管理员

相关内容