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

时间:2010-03-10 18:40:58

标签: ssh ssh-keys openssh

我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我的用途是服务器的系统管理,Git的管理以及同一服务器内的正常Git使用)。我试过简单地将id_rsa文件中的密钥堆叠起来无济于事。

显然,直接的方法是使用命令

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

这非常麻烦。

关于如何更容易地做这件事的任何建议?

21 个答案:

答案 0 :(得分:1101)

来自我的.ssh/config

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

等等。

答案 1 :(得分:265)

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

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

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

如果给定服务器愿意接受密钥,您也只能输入密码。如上所示,ssh并没有尝试为.ssh/id_rsa提供密码,即使它有一个密码。

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

答案 2 :(得分:244)

answer from Randal Schwartz几乎帮助了我。 我在服务器上有不同的用户名,因此我必须将用户关键字添加到我的文件中:

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

现在您可以使用友好名称进行连接:

ssh friendly-name

可在OpenSSH man page找到更多关键字。 注意:列出的某些关键字可能已存在于 / etc / ssh / ssh_config 文件中。

答案 3 :(得分:95)

foo:~$ssh-add ~/.ssh/xxx_id_rsa

确保在添加以下内容之前对其进行测试:

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

如果您遇到任何错误问题,有时会更改文件的安全性有助于:

chmod 0600 ~/.ssh/xxx_id_rsa

答案 4 :(得分:78)

之前的答案已正确解释了创建配置文件以管理多个ssh密钥的方法。我认为,还需要解释的重要事项是在克隆存储库时用别名替换主机名

假设您的公司的GitHub帐户的用户名是abc1234 。 并假设您的个人GitHub帐户的用户名是jack1234

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

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

现在,当您从公司的GitHub帐户克隆存储库 (名为demo)时,存储库URL将类似于:

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

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

git@company:abc1234/demo.git

请注意github.com现在如何替换别名&#34; company&#34;正如我们在配置文件中定义的那样。

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

答案 5 :(得分:23)

  1. 生成SSH密钥:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. 生成another SSH key

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

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

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

    $ nano ~/.ssh/config
    
    Host bitbucket.org  
        User git  
        Hostname bitbucket.org
        PreferredAuthentications publickey  
        IdentityFile ~/.ssh/id_rsa  
    
    Host bitbucket-accountB  
        User git  
        Hostname bitbucket.org  
        PreferredAuthentications publickey  
        IdentitiesOnly yes  
        IdentityFile ~/.ssh/accountB  
    
  4. default帐户克隆。

    $ git clone git@bitbucket.org:username/project.git
    
  5. accountB帐户克隆。

    $ git clone git@bitbucket-accountB:username/project.git
    
  6. See More Here

答案 6 :(得分:22)

我同意Tuomas关于使用ssh-agent的观点。我还想为工作添加第二个私钥,this tutorial对我来说就像一个魅力。

步骤如下:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key例如ssh-add ~/.ssh/id_rsa
  3. $ ssh-add -l
  4. 进行验证
  5. 使用$ssh -v <host url>例如ssh -v git@assembla.com
  6. 进行测试

答案 7 :(得分:13)

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

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

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

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

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

我必须将此命令修改为:

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

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

  

git clone git @ 个人 .bitbucket.org:name / personalproject.git

有关详细信息,请参阅this link

答案 8 :(得分:11)

使用ssh-agent作为密钥。

答案 9 :(得分:6)

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

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "origin"]
      url = git@bitbucket.org:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*

答案 10 :(得分:3)

这是我从the answer of sajib-khan得到启发的解决方案。未设置默认配置。这是我在GitLab上的个人帐户,指定的另一个是我的公司帐户。这是我所做的:

生成SSH密钥

                              [[-2][ 4]
                               [-1][ 1]
[[ 1][ 1][ 1][ 1][ 1][ 1]]  ∙  [ 0][ 0]   =  [[ 3][19]]
                               [ 1][ 1]
                               [ 2][ 4]
                               [ 3][ 9]]

编辑SSH配置

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

删除缓存的SSH密钥

    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/company

测试!

ssh-add -D

欢迎来到GitLab,@ hugo.sohm!

ssh -T git@company.gitlab.com

欢迎来到GitLab,@ HugoSohm!

使用它!

公司帐户

ssh -T git@gitlab.com

个人/默认帐户

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

这是我使用的source

答案 11 :(得分:2)

对我来说,唯一可行的解​​决方案是将其简单地添加到文件$(".datepicker").datetimepicker({ enabledHours:[8,9,10,11,12,13,14,15,16,17,18,19] });中:

~/.ssh/config

Host * IdentityFile ~/.ssh/your_ssh_key IdentityFile ~/.ssh/your_ssh_key2 IdentityFile ~/.ssh/your_ssh_key3 AddKeysToAgent yes 没有任何扩展名。不要使用your_ssh_key

答案 12 :(得分:1)

对于与合作的人,我强烈建议与EC2 Instance Connect合作。

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

通过EC2实例连接,您可以使用AWS Identity and Access Management(IAM)策略和原则来控制对实例的SSH访问,而无需共享和管理SSH密钥。

在安装相关软件包(pip install ec2instanceconnectcli或直接克隆repo之后)您只需更改实例ID即可很容易地连接到多个EC2实例

enter image description here


幕后发生了什么?

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

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

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


链接:

Set up EC2 Instance Connect
Connect using EC2 Instance Connect
Securing your bastion hosts with Amazon EC2 Instance Connect


答案 13 :(得分:1)

GitHub上的多个密钥对

1.0 SSH配置文件

1.1 创建〜/ .ssh / config

1.2 chmod 600〜/ .ssh / config(必须

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

匹萨披萨

HostName github.com

PreferredAuthentications公共密钥#可选

IdentityFile〜/ .ssh / privatekey1

案例A:新的Git新克隆

使用此命令进行Git克隆:

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

注意:如果将来要更改.ssh / config的主机名“ pizza”,请进入Git克隆文件夹,编辑.git / config文件的URL行(请参阅案例B)

案例B:已经拥有Git克隆文件夹

2.1转到克隆的文件夹,然后进入 .git 文件夹

2.2编辑配置文件

2.3将URL从* old更新为 new

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

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

答案 14 :(得分:1)

重要提示:您必须启动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代理。

答案 15 :(得分:1)

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

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

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

 ssh aws

答案 16 :(得分:0)

在Ubuntu 18.04上没有任何事可做。

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

请注意,您可以使用以下命令创建新密钥

# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen 
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub

答案 17 :(得分:0)

正如atlassian blog page上的提及 在 .ssh 中生成包含以下文本的 config

"Principal": {
                "AWS": [
                    "arn:aws:iam::123:root",
                    "arn:aws:iam::456:root",
                    "arn:aws:iam::789:root",
                    "arn:aws:iam::101:root"
                ]
            },

然后,您可以简单地使用后缀域进行检出,并且在项目中可以在本地配置作者姓名等。

答案 18 :(得分:0)

我喜欢在〜/ .ssh / config文件中设置以下内容的方法:

# Configuration for GitHub to support multiple GitHub  keys
Host  github.com
  HostName github.com
  User 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)。

答案 19 :(得分:0)

在Centos 6.5上运行OpenSSH_5.3p1,OpenSSL 1.0.1e-fips,我通过重命名我的密钥文件解决了这个问题,因此没有一个具有默认名称。我的.ssh目录包含id_rsa_foo和id_rsa_bar但没有id_rsa等。

答案 20 :(得分:-1)

您可以尝试使用this sshmulti npm软件包来维护多个SSH密钥。