ssh key 需要命名为id_rsa吗?

ssh key 需要命名为id_rsa吗?

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

我想知道是否有其他人有过这样的经历。我有几个密钥供当前用户使用,它们可以连接到不同的机器。比如说 machine1 和 machine2。我已将我的公钥粘贴到它们各自的 authorized_keys 文件中。我将第一个密钥命名为 id_rsa,将第二个密钥命名为 bender。

当我尝试连接到 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).

它只提供 id_rsa 密钥,如上所示。这是正确的吗?如果正确,为什么?我如何让它提供更多密钥?我知道这是我偶尔看到的问题,因为我在家里有多个密钥,没有太多麻烦。

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

谢谢,麻烦您了。

答案1

默认情况下,SSH 会搜索id_rsaid_ecdsaid_ecdsa_skid_ed25519id_ed25519_skid_dsa文件。密钥不必这样命名,您也可以这样命名mykey,甚至可以将其放在不同的目录中。但是,如果您执行上述任何一项操作,则需要在 ssh 命令中明确引用密钥,如下所示:

ssh user@server -i /path/to/mykey

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

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

怎么运行的

生成密钥时,你会得到两个文件:(id_rsa私钥)和id_rsa.pub(公钥)。顾名思义,私钥需要保密,而公钥可以公开。

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

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

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

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

使用多个键

使用多个密钥并不罕见。ssh user@host -i /path/to/identity_file您可以使用配置文件来代替运行~/.ssh/config

常用设置是IdentityFile(键)和端口。下一个配置将检查~/.ssh/id_dsa并且~/.ssh/bender仅在连接时检查ssh youruser@yourhost

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

如果省略Host yourhost,设置将应用于所有 SSH 连接。还可以为此主机匹配指定其他选项,如User youruserPort 2222等。这将允许您使用简写ssh yourhost而不是进行连接ssh -p 2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender

答案2

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

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

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

ssh bar

ssh 将自动使用:

~/.ssh/foo_user@bar_id_rsa

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

答案3

考虑到 StevenRoose 的评论,指定许多键需要更长的时间,并且我恰好正在处理很多键,所以我想提出我的个人解决方案。

我创建了一个指向我当时想要使用的密钥的符号链接,并且由于它根据我正在从事的项目而偶尔更改,所以我对此很满意。

这里我链接到了在 virtualbox 下运行的机器的密钥:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

还可以添加一个非常快速的脚本来切换到另一组,而无需手动输入再次命令。

再次强调,这不是仅适用于两个键的解决方案,但对于更多的键来说,它可能是可行的。

相关内容