创建带有密钥身份验证的构建服务器时,我曾多次遇到此问题。

我想知道是否还有其他人经历过。对于当前用户,我有几个键,它们可能会连接到不同的计算机。假设machine1和machine2。我已经将我的公共密钥粘贴到了各自的authorized_keys文件中。我将第一个命名为第一把钥匙id_rsa和第二把钥匙弯头。

当我尝试连接到弯管器时,我通过冗长的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_dsaid_rsa文件。密钥不必这样命名,您也可以将其命名为mykey,甚至可以将其放置在其他目录中。但是,如果您执行上述任一操作,则需要像下面这样在ssh命令中显式引用该键:

-i,请使用sshfs选项:键)和IdentityFile(公钥)。顾名思义,应将私钥保密,并可以将公钥公开发布。客户端和服务器都有自己的密钥。安装id_rsa时,服务器的公钥和私钥会自动生成。对于客户端,您必须自己完成操作。

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

服务器检查是否允许连接(在id_rsa.pub中定义)以及您的公钥是否在openssh-server文件中列出。拒绝公共密钥的可能原因:



/etc/ssh/sshd_config



~/.ssh/authorized_keys/etc/ssh/sshd_config已指定,但是您的服务器用户未在“组或用户”列表中列出(默认值未定义,对登录的用户或组没有限制)。或组列表。
您尝试以root用户身份登录,但是AllowUsers设置为AllowGroups(默认DenyUsers)。

DenyGroups设置为PermitRootLogin(默认No)。

yes设置为不同的位置,并且公共密钥未添加到该文件(默认PubkeyAuthentication,相对于主目录) (请注意,该文件是以root用户身份读取的)。

使用多个键

使用多个键并不少见。代替运行No,您可以使用配置文件yes

公用设置是IdentityFile(键)和端口。仅当与AuthorizedKeysFile连接时,下一个配置才会检查“ id_dsa”和“ bender”:

如果忽略.ssh/authorized_keys,则设置将应用于所有SSH连接。还可以为此主机匹配指定其他选项,例如~/.ssh/authorized_keysssh user@host -i /path/to/identity_file等。这将允许您使用简写~/.ssh/config而不是ssh youruser@yourhost进行连接。

评论


为什么需要指定密钥?重点是让我可以更轻松地使用ssh。

–myusuf3
2011年3月17日在18:28

ssh_config(5)中的@StevenRoose:文件名可以使用波浪号语法来引用用户的主目录或以下转义字符之一:'%d'(本地用户的主目录),'%u'(本地用户名) ),“%l”(本地主机名),“%h”(远程主机名)或“%r”(远程用户名)。无法指定通配符,但是我想这应该足够方便。请注意,服务器必须探测您发送的每个密钥,因此指定较少的密钥会更好。主机上的通配符起作用,请再次参见ssh_config(5)的手册页。

– Lekensteyn
2013年4月29日14:43



@therobyouknow您不必为每台计算机创建唯一的密钥对。通常,您只有几个密钥,并将其中一个密钥的公共密钥附加到远程计算机上的.ssh / authorized_keys文件中。如果使用标准的.ssh / id_rsa文件名(或id_dsa,id_ecdsa或最近的id_ed25519),则ssh将自动尝试此操作,并且您无需在配置中指定IdentityFile(或-i path / to / id_file参数)对于ssh)。

– Lekensteyn
2014年2月27日在16:04

我喜欢超出要求的细节之外的答案,并花时间解释这个概念。很棒的工作! +1

–user2490003
16年5月28日在21:43

@landed它是SSH服务器的主机(可以是IP地址或DNS名称)。我试图澄清这一部分,希望对您有所帮助。

– Lekensteyn
17年6月14日在13:34

#2 楼

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

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


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

ssh bar


由于还存储了本地主机,因此允许通过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


还可以添加一个非常快速的脚本来切换到另一组,而无需再次手动键入ln命令。 />同样,这不是仅针对两个键的解决方案,但对于更大的数量,这可能是可行的。

评论


我只是在bash_profile中为我使用的每个服务器添加一个别名。因此,对于名为bob的服务器,我只有这个别名... bob =“ ssh bob.example.com -l pete -i / path / to / key”-然后我只需键入bob-我就可以了!

– Peter Bagnall
2013年12月20日13:49

尽管有时“以您已经知道的方式完成工作”更容易,但是如果您设置.ssh / configs密钥和主机,则有更简便的方法。此评论同时针对评论发布者和评论者@ Peter-Bagnall

–斯科特·普里夫(Scott Prive)
16年2月2日在14:51