複数のSSH公開キーの使用


97

Unfuddleには個人アカウントと企業アカウントがあります。Unfuddleでは、SSHキーは単一のアカウントでのみ使用できるため、両方のアカウント用にラップトップで別個のSSHキーを作成する必要があります。ssh-keygen -t rsa異なる名前の2つのキーを生成するために実行しました(個人はデフォルト名で、会社は{company} _rsaです)。問題は、デフォルトのキーがどこでも使用されているように見え、Gitで個々のリポジトリに使用するキーを指定する方法を見つけることができないことです。

私の質問は次のとおりです。レポジトリベースで使用する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

会社の混乱のないアカウントのレポジトリ用のGitレポジトリ設定ファイルは次のようになります

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

それで、私のssh構成またはgit構成に何か問題があるかどうかはわかりません。


あなたのssh設定は正しく見えます。私は同様の設定を使用しています。
パエロエベルマン

回答:


109

キーがロードされたアクティブなssh-agentがあるid_rsa場合、問題はおそらくsshが最初にそのキーを提供していることです。Unfuddleはおそらく認証のために(たとえばsshdで)受け入れますが、会社のリポジトリにアクセスするための承認では拒否します(たとえば、承認に使用する内部ソフトウェア、おそらくGitoliteに似たもの)。会社のアカウントに個人キーを追加する方法があるかもしれません(複数の人が同じcorp_rsa公開キーファイルと秘密キーファイルを共有していないのですか?)。


IdentitiesOnly .ssh/configコンフィグレーションキーワードは、キーを制限するために使用することができsshでリモートに申し出のsshdだけを介して指定されたものとIdentityFileキーワード(すなわち、それはアクティブにロードすることが起こる任意の追加のキーを使用することを拒否しますssh-agentの)。

これらの.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

7
同じUnfuddleサブドメインに複数のアカウントがある場合(異なるSSHキーを使用)、2番目の方法を使用する必要があります。
leolobato

IdentitiesOnlyは、私のgitoliteのセットアップに不可欠でした、ありがとう!
公園。

1
これにより、すべてのキーがgithubに送信されるという問題が修正されます。ただし、OS XIでは、パスフレーズを毎回入力する必要があります。configで指定されたキーのみを使用し、sshエージェントを使用し続けると言う方法はありますか?
ドリュー

1
@Drew:キーがすでにエージェントにロードされている場合、コマンドは引き続きエージェントからそれを描画する必要があります。キーが事前にロードされていますか?ssh-add -lGitホストエイリアスを使用する前に確認してください。また、sshssh-agentが保存している鍵を認識できるように、公開鍵ファイルが存在する必要があります。の.pubようなコマンドを使用して、失われたファイルを再生成できますssh-keygen -f blah -y > blah.pub
クリスジョンセン

うん、そこにある。IdentitiesOnly呼び出しを削除すると、githubに4つの異なるキー(パスフレーズを要求しない正しいキーを含む)が送信されます。呼び出しを追加すると、1つのキーのみが送信されますが、パスフレーズは毎回要求されます。OSXにパスフレーズ値をキーチェーンに保存するように指示した場合でも。
ドリュー

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リポジトリでホストとして使用します。


タス、上記の私の変更を確認してもらえますか?ssh_configとgit configを追加しました。

Hostは単なる識別子です-完全なドメイン名は不要です。それはおそらくいくつかの隠れたバグを作成します。それを変更する場合、git configでフルネームをスペルする必要はありません。

gitoriousの場合、user = gitおよびホストgitorious.org:例:git@gitorious.org:〜revelut / qt / bruce-sandbox-qt.gitホストでURLの一部をどのように一致させますか?(通常〜啓示)

@Tassですから、SSH構成にcompany_unfuddleという名前を付けると、URLはgit @ company_unfuddle:{company} /overall.gitになりますか?@ブルース-あなたが何を求めているのか分かりません。もう少し拡大してもらえますか?

3

IdentityFileとIdentitiesOnlyはうまく機能します。気になるのは、異なるホスト名を使用して接続することを覚えておく必要があること、および転送されたエージェント接続がまだすべてのキーを保持しているという事実です。つまり、リモートホストが侵害された場合、私は。

私は最近使用を開始しました:

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

それはsshのラッパーです、それ:

  • 定義するIDごとに完全に別個のエージェントを保持します。
  • ログインセッション全体でエージェントを自動的に共有します。.bashrcでは何もしません。
  • 最初に必要なときに、エージェントと対応するキーをオンデマンドでロードします。
  • sshコマンドライン(ホスト名など)または現在の作業ディレクトリに基づいて、使用するエージェントを決定します。これは、自分が何をしているかに応じて異なるパスから作業する傾向があるため、特に便利です。

0

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エージェント転送など)にアクセスできない場合にも役立ちます


これはそうssh-add -Lでないかもしれないssh-agent
4

@ivesのおかげで、修正済み
Vanuan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.