使用多个 SSH 公钥

使用多个 SSH 公钥

我在 Unfuddle 上有一个个人帐户和一个公司帐户。在 Unfuddle 上,SSH 密钥只能在一个帐户上使用,因此我需要在笔记本电脑上为这两个帐户创建单独的 SSH 密钥。我运行ssh-keygen -t rsa生成了两个具有不同名称的密钥(个人是默认名称,公司是 {company}_rsa)。现在的问题是,似乎我的默认密钥到处都在使用,我找不到如何在 Git 中为单个存储库指定密钥。

所以我的问题是:如何指定在 repo-to-repo 基础上使用的 SSH 密钥?

我设置了我的 ssh_config (~/.ssh/config),但它似乎仍然不起作用。

配置:

Host {personalaccount}.unfuddle.com
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/id_rsa

Host {companyaccount}.unfuddle.com
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile /Users/dave/.ssh/cage_rsa

我公司 unfuddle 帐户上的 repo 的 Git repo 配置文件如下所示:

[remote "origin"]
     url = git@{companyaccount}.unfuddle.com:{companyaccount}/overall.git
     fetch = +refs/heads/*:refs/remotes/origin/*

所以我不确定我的 ssh 配置或 git 配置是否有问题。

答案1

如果你有一个活跃ssh 代理加载了你的id_rsa密钥,那么问题很可能是远程控制首先提供该密钥。Unfuddle 可能会接受它进行身份验证(例如sshd),但拒绝授权访问公司存储库(例如,在他们用于授权的任何内部软件中,可能是类似于 Gitolite 的东西)。也许有一种方法可以将您的个人密钥添加到公司帐户(多个人不会共享相同的corp_rsa公钥和私钥文件,是吗?)。


配置IdentitiesOnly .ssh/config关键字可用于限制远程控制提供给远程sshd仅使用关键字指定的关键字IdentityFile(即它将拒绝使用任何恰好加载到活动ssh 代理)。

尝试以下.ssh/config部分:

Host {personalaccount}.unfuddle.com
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host {companyaccount}.unfuddle.com
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

然后,使用如下 Git URL:

git@{personalaccount}.unfuddle.com:{personalaccount}/my-stuff.git
git@{companyaccount}.unfuddle.com:{companyaccount}/their-stuff.git

如果您想充分利用该.ssh/config机制,您可以提供自己的自定义主机名并更改默认用户名:

Host uf-mine
     HostName {personalaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/id_rsa
     IdentitiesOnly yes

Host uf-comp
     HostName {companyaccount}.unfuddle.com
     User git
     IdentityFile ~/.ssh/{companyaccount}_rsa
     IdentitiesOnly yes

然后,使用如下 Git URL:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git

答案2

IdentityFile 和 IdentitiesOnly 运行良好。让我烦恼的是必须记住使用不同的主机名进行连接,而且转发的代理连接仍然保存所有密钥,这意味着如果远程主机受到攻击,他们可以在我登录时使用我的任何身份。

我最近开始使用:

https://github.com/ccontavalli/ssh-ident

它是 ssh 的包装器,它:

  • 为您定义的每个身份保留一个完全独立的代理。
  • 自动在登录会话之间共享代理,无需在 .bashrc 中进行任何操作。
  • 第一次需要时按需加载代理和相应的密钥。
  • 根据 ssh 命令行(主机名等)或当前工作目录确定使用哪个代理。这特别方便,因为我倾向于根据正在做的事情从不同的路径工作。

答案3

man ssh_config

就像是

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

personal_repo在你的 git repo 中用作主机。

答案4

如果您想使用 ssh 代理,以下是正确的方法:

# Create public keys to make sure they exist
# this is a must if you use ssh agent forwarding
# or want to use ssh-agent at all
ssh-add -L | grep personal > ~/.ssh/personal_identity.pub
ssh-add -L | grep company > ~/.ssh/company_identity.pub


# Add to ~/.ssh/config
Host {personalaccount}.unfuddle.com
  IdentityFile ~/.ssh/personal_identity.pub

Host {companyaccount}.unfuddle.com
  IdentityFile ~/.ssh/company_identity.pub

解释:如果您的 ~/.ssh 目录中有私钥,则不会使用 ssh-agent。因此,我们用另一个名称创建公钥,这样 ssh 就被迫使用 ssh-agent。如果您无权访问私钥(例如 ssh 代理转发),这也会有所帮助

相关内容