在创建带有密钥身份验证的构建服务器时,我遇到过几次这个问题。
我想知道是否有其他人经历过这种情况。我的当前用户有几个可以连接到不同机器的密钥。假设机器 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_dsa
和id_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
:
AllowUsers
或AllowGroups
已指定,但您的服务器用户未列在组或用户列表中(默认未定义,对用户或组的登录没有限制)。DenyUsers
或DenyGroups
被指定并且您在用户或组列表中。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 youruser
,Port 2222
等等。这将允许您与速记连接ssh yourhost
代替ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender
。
小智 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 共享主目录(每台机器不同的密钥!),甚至可以识别密钥应该在哪台机器上......