ssh 密钥需要命名为 id_rsa 吗?

myu*_*uf3 148 ssh openssh

在创建带有密钥身份验证的构建服务器时,我遇到过几次这个问题。

我想知道是否有其他人经历过这种情况。我的当前用户有几个可以连接到不同机器的密钥。假设机器 1 和机器 2。我已将我的公钥粘贴到他们各自的 authorized_keys 文件中。我将第一个命名为第一个键 id_rsa 和第二个键弯曲器。

当我尝试连接到 Bender 时,我通过详细的 ssh 连接获得以下输出

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)

如上所示,它仅提供 id_rsa 密钥。这样对吗?如果是为什么?我如何让它提供更多的钥匙?我知道这是我间歇性地看到的一个问题,因为我在家里有多个钥匙没有太多麻烦。

我还想了解一下公钥和私钥如何与客户端和服务器交互的概述。我以为我有一个不错的主意,但显然我遗漏了一些东西。

谢谢,麻烦您了。

Lek*_*eyn 174

默认情况下,ssh 搜索id_dsaid_rsa文件。键不必像这样命名,您也可以命名它mykey,甚至将它放在不同的目录中。但是,如果您执行其中任何一个操作,那么您需要在 ssh 命令中显式引用密钥,如下所示:

ssh user@server -i /path/to/mykey
Run Code Online (Sandbox Code Playgroud)

如果命令不接受-i,例如sshfs,使用IdentityFile选项:

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

生成密钥时,您将获得两个文件:(id_rsa私钥)和id_rsa.pub(公钥)。顾名思义,私钥应该保密,公钥可以向公众发布。

公钥认证使用公钥和私钥。客户端和服务器都有自己的密钥。安装openssh-server服务器时会自动生成公钥和私钥。对于客户,你必须自己做。

当您(客户端)与服务器连接时,会交换公钥。您将收到一台服务器,而服务器则是您的。第一次收到服务器公钥时,系统会要求您接受它。如果此公钥随时间发生变化,您将收到警告,因为可能的 MITM(中间人)攻击正在进行,拦截客户端和服务器之间的流量。

服务器检查您是否被允许连接(在 中定义/etc/ssh/sshd_config)以及您的公钥是否在~/.ssh/authorized_keys文件中列出。公钥被拒绝的可能原因:

  • /etc/ssh/sshd_config
    • AllowUsersAllowGroups已指定,但您的服务器用户未列在组或用户列表中(默认未定义,对用户或组的登录没有限制)。
    • DenyUsersDenyGroups被指定并且您在用户或组列表中。
    • 您正在尝试以 root 身份登录,但PermitRootLogin设置为No(default yes)。
    • PubkeyAuthentication设置为No(默认yes)。
    • AuthorizedKeysFile设置为不同的位置,并且公钥不会添加到该文件中(默认.ssh/authorized_keys,相对于主目录)
  • ~/.ssh/authorized_keys: 你的公钥没有添加到这个文件中(注意这个文件是以root用户身份读取的)

使用多个键

使用多个键的情况并不少见。而不是运行的ssh user@host -i /path/to/identity_file,你可以使用一个配置文件,~/.ssh/config

常见设置是 IdentityFile(密钥)和端口。下一个配置将仅在连接时检查“id_dsa”和“bender” ssh youruser@yourhost

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender
Run Code Online (Sandbox Code Playgroud)

如果省略Host yourhost,则设置将应用于所有 SSH 连接。其他选项也可以此主机匹配指定的,像User youruserPort 2222等等。这将允许您与速记连接ssh yourhost代替ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender

  • 我喜欢超出所需细节的答案,并花时间解释这个概念。很棒的工作!+1 (4认同)
  • @StevenRoose 来自`ssh_config(5)`:*文件名可以使用波浪号语法来引用用户的主目录或以下转义字符之一:'%d'(本地用户的主目录)、'%u'(本地用户名)、“%l”(本地主机名)、“%h”(远程主机名)或“%r”(远程用户名)。* 不能指定通配符,但这应该很方便我猜够了。请注意,服务器必须探测您发送的每个密钥,因此指定的密钥越少越好。主机上的通配符工作,请再次参见 `ssh_config(5)` 的手册页。 (2认同)
  • @therobyouknow 您不必为每台机器创建唯一的密钥对。通常你有几个密钥,并将其中一个密钥的公钥附加到远程机器上的 `.ssh/authorized_keys` 文件中。如果你使用标准的 `.ssh/id_rsa` 文件名(或 id_dsa、id_ecdsa 或最近的 id_ed25519),那么 ssh 会自动尝试这个,你不需要在你的配置中指定 `IdentityFile`(或 `-i 路径`ssh` 的 /to/id_file` 参数)。 (2认同)

小智 46

我最喜欢的方法允许自动选择私钥

IdentityFile ~/.ssh/%l_%r@%h_id_rsa
Run Code Online (Sandbox Code Playgroud)

SSH 将 %l 替换为本地机器名称, %r 替换为远程用户名, %h 替换为远程主机,因此如果我想从名为 foo 的机器连接到 bar 作为用户,我运行:

ssh bar
Run Code Online (Sandbox Code Playgroud)

并且 ssh 会自动使用:

~/.ssh/foo_user@bar_id_rsa
Run Code Online (Sandbox Code Playgroud)

由于本地主机也被存储,这允许通过 NFS 共享主目录(每台机器不同的密钥!),甚至可以识别密钥应该在哪台机器上......