在创建使用密钥身份验证的构建服务器时,我遇到过几次这个问题。
我想知道是否有其他人有过这样的经历。我有几个密钥供当前用户使用,它们可以连接到不同的机器。比如说 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_rsa
、id_ecdsa
、id_ecdsa_sk
、id_ed25519
、id_ed25519_sk
和id_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
:AllowUsers
或AllowGroups
已指定,但您的服务器用户未在组或用户列表中列出(默认未定义,对用户或组登录没有限制)。DenyUsers
或DenyGroups
已指定,并且您位于用户或组列表中。- 您正在尝试以 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 youruser
、Port 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
还可以添加一个非常快速的脚本来切换到另一组,而无需手动输入在再次命令。
再次强调,这不是仅适用于两个键的解决方案,但对于更多的键来说,它可能是可行的。