问题描述
在使用密钥认证创建构建服务器时,我偶然遇到过这个问题。
我想知道是否有其他人有这方面的经验。我有几个可以连接到不同机器的当前用户的密钥。让我们说machine1和machine2。我已将我的公钥粘贴到其各自的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).
它只提供id_rsa键,如上所示。它是否正确?如果是这样,为什我如何获得它提供更多的密钥?我知道这是我间歇性看到的一个问题,因为我在家里有多个键,没有太多麻烦。
我还想知道酒吧和私人钥匙如何与客户端和服务器进行交互。我以为我有一个相当不错的想法,但显然我错过了一些东西。
谢谢,麻烦您了。
最佳解决思路
默认情况下,ssh搜索id_dsa
和id_rsa
文件。这些键不一定要这样命名,您可以将它命名为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
(公钥)。正如他们的名字所暗示的那样,私钥应该保密,公钥可以公开发布。
Public-key身份验证适用于公钥和私钥。客户端和服务器都有自己的密钥。安装openssh-server
时,会自动生成服务器公钥和私钥。对于客户,你必须自己做。
当你(客户端)连接服务器时,公钥会被交换。你会收到一台服务器,以及你的服务器。您第一次收到服务器公钥时,系统会要求您接受它。如果此公钥一段时间内发生变化,您将被警告,因为可能发生了MITM(中间人攻击)攻击,拦截客户端和服务器之间的流量。
服务器检查是否允许您连接(在/etc/ssh/sshd_config
中定义)以及您的公钥是否在~/.ssh/authorized_keys
文件中列出。公钥被拒绝的可能原因:
-
/etc/ssh/sshd_config
:-
AllowUsers
或AllowGroups
已指定,但您的服务器用户未列在组或用户列表中(默认未定义,对登录的用户或组没有限制)。 -
指定了
DenyUsers
或DenyGroups
,并且您位于用户或组列表中。 -
您尝试以超级用户身份登录,但
PermitRootLogin
已设置为No
(默认yes
)。 -
PubkeyAuthentication
设置为No
(默认yes
)。 -
AuthorizedKeysFile
被设置为不同的位置,并且公钥不会被添加到该文件(默认.ssh/authorized_keys
,相对于主目录)
-
-
~/.ssh/authorized_keys
:您的公钥没有添加到该文件中(请注意,此文件是以root用户身份读取的)
使用多个键
使用多个密钥并不罕见。您可以使用配置文件~/.ssh/config
而不是运行ssh user@host -i /path/to/identity_file
。
常用设置是IdentityFile(密钥)和端口。仅当与ssh youruser@yourhost
连接时,下一个配置将检查”id_dsa”和”bender”:
Host yourhost
IdentityFile ~/.ssh/id_dsa
IdentityFile ~/.ssh/bender
如果您省略Host yourhost
,则这些设置将应用于所有SSH连接。还可以为此主机匹配指定其他选项,例如User youruser
,Port 2222
等。这可让您使用简写ssh yourhost
而不是ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender
。
次佳解决思路
我最喜欢的方法允许自动选择私钥
IdentityFile ~/.ssh/%l_%r@%h_id_rsa
SSH将用本地机器名替换%l,用远程用户名替换%r,用远程主机替换%h,因此如果我想从我的机器以foo连接到用户,我运行:
ssh bar
而ssh会自动使用:
~/.ssh/foo_user@bar_id_rsa
由于本地主机也被存储,所以这允许通过NFS共享主目录(每台机器使用不同的密钥!),甚至可以识别密钥本来应该在哪台机器上……