在一个客户端上使用多个SSH私钥的最佳方法

我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我的用途是服务器的系统管理、Git管理和同一服务器中的正常Git使用)。我尝试简单地将键堆叠在id_rsa文件中,但没有任何效果。

显然,要做到这一点,一个简单的方法是使用命令

ssh -i <key location> login@server.example.com

这很麻烦。

有什么建议可以让你做这件事更容易一些吗?

639179 次浏览

对密钥使用ssh-agent。

来自我的.ssh/config:

Host myshortname realname.example.comHostName realname.example.comIdentityFile ~/.ssh/realname_rsa # private key for realnameUser remoteusername
Host myother realname2.example.orgHostName realname2.example.orgIdentityFile ~/.ssh/realname2_rsa  # different private key for realname2User remoteusername

然后您可以使用以下连接:

# 0

# 0

等等。

ssh-add ~/.ssh/xxx_id_rsa

请确保在添加之前进行测试:

ssh -i ~/.ssh/xxx_id_rsa username@example.com

如果你有任何错误的问题,有时改变文件的安全性有助于:

chmod 0600 ~/.ssh/xxx_id_rsa
兰德尔·施瓦茨的回答几乎帮了我全部的忙。我在服务器上有不同的用户名,所以我必须在文件中添加用户关键字:

Host           friendly-nameHostName       long.and.cumbersome.server.nameIdentityFile   ~/.ssh/private_ssh_fileUser           username-on-remote-machine

现在你可以使用friendly-name进行连接:

ssh friendly-name

更多的关键字可以在OpenSSH手册上找到。注意:列出的一些关键字可能已经出现在你的/etc/ssh/ssh_config文件中。

我同意Tuomas使用ssh-agent。我还想为工作添加第二个私钥,本教程对我来说非常有效。

步骤如下:

  1. # 0
  2. 例1
  3. 通过$ ssh-add -l验证
  4. $ssh -v <host url>例如ssh -v git@assembla.com测试它

您可以指示ssh在连接时连续尝试多个键。方法如下:

$ cat ~/.ssh/configIdentityFile ~/.ssh/id_rsaIdentityFile ~/.ssh/id_rsa_oldIdentityFile ~/.ssh/id_ed25519# ... and so on
$ ssh server.example.com -v....debug1: Next authentication method: publickeydebug1: Trying private key: /home/example/.ssh/id_rsadebug1: read PEM private key done: type RSAdebug1: Authentications that can continue: publickeydebug1: Trying private key: /home/example/.ssh/id_rsa_olddebug1: read PEM private key done: type RSA....[server ~]$

这样就不必指定哪个密钥适用于哪个服务器。它会使用第一个工作键。

此外,只有当给定的服务器愿意接受密钥时,您才可以输入密码短语。如上所述,ssh没有尝试为.ssh/id_rsa询问密码,即使它有密码。

当然,它不会像其他答案那样胜过每个服务器的配置,但至少您不必为您连接的所有服务器和每个服务器添加配置!

您可以在~/.ssh文件夹中创建一个名为config的配置文件。它可以包含:

Host awsHostName *yourip*User *youruser*IdentityFile *idFile*

这将允许您像这样连接到机器

 ssh aws

前面的回答已经正确地解释了如何创建一个配置文件来管理多个ssh密钥。我认为,还需要解释的重要事情是在克隆存储库时将主机名替换为别名

假设,你的该公司GitHub账户的用户名是abc1234。假设个人GitHub账号的用户名是jack1234

并且,假设您已经创建了两个RSA密钥,即id_rsa_companyid_rsa_personal。因此,您的配置文件将如下所示:

# Company accountHost companyHostName github.comPreferredAuthentications publickeyIdentityFile ~/.ssh/id_rsa_company
# Personal accountHost personalHostName github.comPreferredAuthentications publickeyIdentityFile ~/.ssh/id_rsa_personal

现在,当你从公司的GitHub帐户克隆存储库 (演示)时,存储库URL将是这样的:

Repo URL: git@github.com:abc1234/demo.git

现在,在执行git clone时,您应该将上述存储库URL修改为:

git@company:abc1234/demo.git

注意github.com现在是如何被我们在配置文件中定义的别名“company”所取代的。

同样,您必须根据配置文件中提供的别名修改个人帐户中存储库的克隆URL。

我曾经遇到过这个问题,当时我有两个Bitbucket帐户,想要为两个帐户存储单独的SSH密钥。这对我来说很管用。

我创建了两个单独的ssh配置,如下所示。

Host personal.bitbucket.orgHostName bitbucket.orgUser gitIdentityFile /Users/username/.ssh/personalHost work.bitbucket.orgHostName bitbucket.orgUser gitIdentityFile /Users/username/.ssh/work

现在当我必须从我的工作帐户克隆一个存储库时,命令如下所示。

git clone git@bitbucket.org:teamname/project.git

我必须修改这个命令:

git clone git@**work**.bitbucket.org:teamname/project.git

同样,从我的个人帐户克隆命令必须修改为

Git克隆Git @个人.bitbucket.org:name/personalproject.git

更多信息请参考这个链接

  1. 生成SSH密钥:

     $ ssh-keygen -t rsa -C <email1@example.com>
  2. < p >生成# 0:

     $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>

    现在,两个公钥(id_rsa . pubaccountB.pub)应该存在于~/.ssh/目录中。

     $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory
  3. 创建配置文件~/.ssh/config,内容如下:

     $ nano ~/.ssh/config
    Host bitbucket.orgUser gitHostname bitbucket.orgPreferredAuthentications publickeyIdentityFile ~/.ssh/id_rsa
    Host bitbucket-accountBUser gitHostname bitbucket.orgPreferredAuthentications publickeyIdentitiesOnly yesIdentityFile ~/.ssh/accountB
  4. default账号克隆。

     $ git clone git@bitbucket.org:username/project.git
  5. 克隆accountB账号

     $ git clone git@bitbucket-accountB:username/project.git

注意:因为User git指令,你可以省略回收URL的git@部分,像这样缩短你的clone命令:

    $ git clone bitbucket-accountB:username/project.git

这是该指令的唯一目的。如果你不需要它(例如,你总是从网站复制粘贴git克隆命令),你可以把它从配置中去掉。

See More Here

CentOS 6.5运行OpenSSH_5.3p1和OpenSSL 1.0.1e-fips时,我通过重命名密钥文件来解决这个问题,这样它们都没有默认名称。

我的.ssh目录包含id_rsa_foo和id_rsa_bar,但没有id_rsa等。

重要提示:必须启动ssh-agent

在使用ssh-add之前,必须启动ssh-agent(如果它还没有运行),如下所示:

eval `ssh-agent -s` # start the agent
ssh-add id_rsa_2 # Where id_rsa_2 is your new private key file

注意,eval命令在Windows上的Git Bash上启动代理。其他环境可能使用一个变体来启动SSH代理。

现在,使用最新版本的Git,我们可以在特定于存储库的Git配置文件中指定sshCommand:

  [core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = truesshCommand = ssh -i ~/.ssh/id_rsa_user[remote "origin"]url = git@bitbucket.org:user/repo.gitfetch = +refs/heads/*:refs/remotes/origin/*

正如在一个Atlassian博客页面中提到的,在. ssh文件夹中生成一个配置文件,包括以下文本

#user1 accountHost bitbucket.org-user1HostName bitbucket.orgUser gitIdentityFile ~/.ssh/user1IdentitiesOnly yes
#user2 accountHost bitbucket.org-user2HostName bitbucket.orgUser gitIdentityFile ~/.ssh/user2IdentitiesOnly yes

然后,您可以简单地用后缀域签出,在项目中,您可以在本地配置作者名称等。

18.04 Ubuntu  (Bionic Beaver)上没有什么可做的。

成功创建第二个SSH密钥后,系统将尝试为每个连接查找匹配的SSH密钥。

你可以用下面这些命令创建一个新密钥:

# Generate key make sure you give it a new name (id_rsa_server2)ssh-keygen
# Make sure ssh agent is runningeval `ssh-agent`
# Add the new keyssh-add ~/.ssh/id_rsa_server2
# Get the public key to add it to a remote system for authenticationcat ~/.ssh/id_rsa_server2.pub

GitHub上的多个键对

1.0 SSH配置文件

1.1 创建 ~/.ssh/config

1.2 chmod 600 ~/。ssh / config (# 0)

1.3在文件中输入如下内容:

主机披萨

主机名:github.com

PreferredAuthentications publickey #可选

IdentityFile ~ / . ssh / privatekey1

案例A:全新的Git克隆

使用此命令克隆Git:

$ git clone git@pizza:yourgitusername/pizzahut_repo.git

注意:如果以后要更改.ssh/config的主机名“pizza”,进入Git克隆文件夹,编辑.git/config文件URL行(见case B)

情况B:已经有Git克隆文件夹

2.1进入克隆文件夹,然后进入.文件夹

2.2编辑配置文件

2.3更新URL从*old到:

(Old) URL = git@github.com:yourgitusername/pizzahut_repo.git
(New) URL = git@pizza:yourgitusername/pizzahut_repo.git

您可以尝试 sshmulti npm包来维护多个SSH密钥。

下面是我从sajib-khan的回答中得到的灵感。没有设置默认配置;第一条是我的个人账户,另一个是我的公司账户。以下是我所做的:

生成SSH密钥

ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"

编辑SSH配置

nano ~/.ssh/config
    Host company.gitlab.comHostName gitlab.comPreferredAuthentications publickeyIdentityFile ~/.ssh/company

删除缓存的SSH密钥

ssh-add -D

测试它!

ssh -T git@company.gitlab.com

欢迎来到GitLab, @hugo.sohm!

ssh -T git@gitlab.com

欢迎来到GitLab, @HugoSohm!

使用它!

公司账户

git clone git@company.gitlab.com:group/project.git

个人/默认账户

git clone git@gitlab.com:username/project.git

这是我使用的

我喜欢在~/.ssh/config文件中设置以下方法:

# Configuration for GitHub to support multiple GitHub  keysHost  github.comHostName github.comUser git
# UseKeychain adds each keys passphrase to the keychain so you# don't have to enter the passphrase each time.UseKeychain yes
# AddKeysToAgent would add the key to the agent whenever it is# used, which might lead to debugging confusion since then# sometimes the one repository works and sometimes the# other depending on which key is used first.#  AddKeysToAgent yes
# I only use my private id file so all private# repositories don't need the environment variable# `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.IdentityFile ~/.ssh/id_rsa

然后在你的存储库中创建一个.env文件,其中包含要使用的ssh命令:

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

如果你使用dotenv,环境变量会自动导出,你可以为每个项目/目录指定你想要的键。口令只被请求一次,因为它被添加到密钥链中。

这个解决方案与Git一起完美地工作,并且设计为在Mac上工作(由于UseKeychain)。

对我来说,在MacOs上,唯一可行的解决方案就是在文件~/.ssh/config中添加这个:

Host *IdentityFile ~/.ssh/your_ssh_keyIdentityFile ~/.ssh/your_ssh_key2IdentityFile ~/.ssh/your_ssh_key3AddKeysToAgent yes

your_ssh_key没有任何扩展名。不要使用第一条。

对于那些使用的人,我强烈推荐使用EC2实例连接

Amazon EC2 Instance Connect提供了一种使用secure Shell (SSH)连接到实例的简单而安全的方法。

使用EC2实例连接,您可以使用AWS身份和访问管理(IAM)策略和原则来控制对实例的SSH访问,从而消除了共享和管理SSH密钥的需要。

在安装相关软件包(pip install ec2instanceconnectcli或直接克隆回购)您可以通过更改实例id轻松连接到多个EC2实例后:

enter image description here


幕后发生了什么?

当您使用EC2实例连接连接到实例时,实例连接API将一次性使用的SSH公钥推送到实例元数据中,该公钥在该实例元数据中保持60秒。附加到您的IAM用户的IAM策略授权您的IAM用户将公钥推送到实例元数据。

SSH守护进程使用在安装实例连接时配置的AuthorizedKeysCommand和AuthorizedKeysCommandUser从实例元数据中查找公钥进行身份验证,并将您连接到实例。

(*)亚马逊Linux 2 2.0.20190618或更高版本和Ubuntu 20.04或更高版本预先配置了EC2实例连接。对于其他受支持的Linux发行版,必须为支持使用Instance Connect的每个实例设置Instance Connect。这是每个实例的一次性需求


链接:

< p > # 0 < br ># 0 < br ># 0 < / p >