我有两个公钥,一个用于某些服务器,另一个用于其他服务器。如何指定在连接服务器时使用哪个密钥?
答案1
假设您处于 Unix/Linux 环境中,您可以创建或编辑文件~/.ssh/config
。
该配置文件允许您建立每个主机使用的参数;例如:
Host host1
HostName <hostname_or_ip>
IdentityFile ~/.ssh/identity_file1
Host Host2
HostName <hostname_or_ip2>
User differentusername
IdentityFile ~/.ssh/identity_file2
请注意,host1 和 host2 也可以不是主机名,而是用于识别服务器的标签。
现在您可以使用以下命令登录到主机:
ssh host1
ssh host2
答案2
clone
我在或pull
任何 git 操作期间明确提到了密钥。
首先需要用ssh-keygen
命令创建密钥文件,然后将该.pub
文件复制到主机。
并且在连接过程中,使用不带任何扩展名的文件。
简单的一行
git -c core.sshCommand="ssh -i ~/.ssh/id1" pull
git -c core.sshCommand="ssh -i ~/.ssh/id1" clone <github>.git
答案3
提问者特别询问他们如何使用两种不同的方式连接到两组不同的服务器民众钥匙,但答案在写这篇文章的时候出现对我来说,如果用户有两个不同的私人的键。
我要去认为这里有一个用例,用户可能生成了一个私钥,并且其对应的公钥由两个不同的证书颁发机构签名两次。因此,他们需要将其中一个签名的公钥用于一组服务器,将另一个用于另一组服务器。或者,它可能是一个证书颁发机构,但公钥的签名不同,可能针对两个不同的用户等。无论哪种方式,都只有一个私钥,用户需要使用两个不同的对应公钥之一才能连接到远程服务器。我还假设我们只处理 OpenSSH 密钥,而不是使用可能略有不同的 x509 证书文件(尚未测试)。
在这种情况下,假设我们不能依赖 SSH 的任何默认行为,因此需要手动指定私钥和公钥,那么我们可以在连接时像这样指定两者:
ssh -i /path/to/private/key -i /path/to/public/key username@hostname
阅读 SSH 手册时,它看起来-i
像身份文件适用于私钥而不是公钥,如下所示:
...但是当我在本地环境中使用 Ubuntu 20.04 进行测试并连接到 Debian 12 服务器时,此方法有效。
但是,当我阅读本地 SSH 手册页时,我还可以看到指定的选项CertificateFile
,这感觉更合适,而且我发现它也同样有效。
可以这样做:
ssh \
-i /path/to/private/key \
-o CertificateFile=/path/to/public/key \
username@hostname
SSH 配置文件
正如其他人指出的那样,在 SSH 配置文件中指定详细信息通常更方便。幸运的是,我发现在测试期间,我也可以在这里同时使用IdentityFile
和CertificateFile
子句。
例如,以下两种方法都可以起作用(假设您根据自己的设置更改了相应的值)
Host my-server-alias
User myUsername
Port 22
Hostname 192.168.0.1
IdentityFile /path/to/private/key
CertificateFile /path/to/signed/public/key
Host my-server-alias
User myUsername
Port 22
Hostname 192.168.0.1
IdentityFile /path/to/private/key
IdentityFile /path/to/signed/public/key
答案4
在 Fedora 27 上,您可以将私钥/公钥放在 ~/.ssh/ 下,然后当您 ssh 到主机时,它们两个都会自动尝试。