1つのクライアントで複数のSSH秘密鍵を使用する最良の方法


871

複数の秘密鍵を使用して、異なるサーバーまたは同じサーバーの異なる部分に接続したい(私の用途は、サーバーのシステム管理、Gitの管理、および同じサーバー内での通常のGitの使用です)。id_rsaファイル内のキーを単純に積み重ねてみたが役に立たなかった。

どうやらこれを行う簡単な方法は、コマンドを使用することです

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

それはかなり面倒です。

これを少し簡単にする方法についての提案はありますか?


1
私が書いたこの記事の様々な構成とその強さ/欠点に深さになります。
ラフィ

回答:


1234

私から.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

等々。


25
ランダル、ありがとう!私は.ssh / configを少し調べ て、これを見つけました: github.com/guides/multiple-github-accounts私を正しい方向に向けました。
Justin

6
これは非常に役立ちました(stackoverflow.com/a/3828682/169153に加えて)。あなたが使用したい場合はパテキーは、ここで、この文書は、次のとおりです。blog.padraigkitterick.com/2007/09/16/...
Urda

2
この投稿はとても役に立ちました。構成ファイルを作成するときに私が犯した1つのエラーは、「touch」コマンドを実行して構成ファイルを作成する代わりに、.sshフォルダーに.txtファイルを置くことでした。
M_x_r

53
IdentityFile同じに対して複数のエントリを指定することもできHost、接続時に順番に試行されることに注意してください。
2013年

12
IdentitiesOnly yes〜/ .ssh / id_rsaまたはその他のIDを防止するために使用します。(これは元々編集
でした

370

接続時に複数のキーを続けて試すように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持っている場合でもパスワードを要求しませんでした。

確かに、他の回答のようにサーバーごとの構成に勝るものはありませんが、少なくとも、接続するすべてのサーバーの構成を追加する必要はありません。


13
これは、尋ねられた質問に対する素晴らしい解決策ですが、質問者が意図したニーズを完全には満たしていませんでした。私にとっては、これはまさに適切なソリューションであり、「1つのクライアントで複数のSSH秘密鍵を使用する最良の方法」のニーズを完全に満たしています。
ウェイド

2
これは、構成ファイルのホスト宣言では機能しないようです
Maksim Luzik

30
これはgitではうまく機能しません。2つのgithubデプロイキーがある場合、リストの最初のキーは有効であり機能しますが、githubはリポジトリが一致しないというメッセージを表示します。
Adam Reis

1
SFTP /ターゲットサーバーにアカウントをロックするセキュリティポリシーがある場合(たとえば、3回の接続試行が失敗した後など)、アカウントがロックされることにはなりません。接続が試行されますが、「間違ったキー」ファイル
alchemist.gamma

7
これらのサーバーでfail2banのようなものがあるかどうかに注意してください。あなたはそれらの刑務所の1つに終わるかもしれません...他のキーによって生成された試みが失敗したため...
Piccolo

254

ランダルシュワルツから回答は、ほとんどの場合私を助けてくれました。サーバーに別のユーザー名があるため、ファイルにUserキーワードを追加する必要がありました。

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

これで、フレンドリ名を使用して接続できます。

ssh friendly-name

OpenSSHのmanページで他のキーワードを見つけることができます注記:リストされているキーワードの一部は、/ etc / ssh / ssh_configファイルにすでに存在している場合があります。


私が間違っていない場合は、user @ hostで接続するときに、URLで直接指定するユーザーを通常指定します
a1an

3
「Port」キーワードも使用したい。別の興味深いキーワードは「StrictHostKeyChecking」です。
2013

122

以前の回答では、複数のsshキーを管理する構成ファイルを作成する方法を適切に説明しました。また、説明が必要な重要なことは、リポジトリのクローン作成中にホスト名をエイリアス名に置き換えることです

あなたの、仮定の会社のGitHubのアカウントのユーザー名がABC1234です。また、個人のGitHubアカウントのユーザー名がjack1234であるとします。

また、id_rsa_companyid_rsa_personalの 2つのRSA鍵を作成したとします。したがって、構成ファイルは次のようになります。

# 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アカウントからリポジトリ (デモという名前)のクローンを作成すると、リポジトリのURLは次のようになります。

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

ここで、を実行git cloneするときに、上記のリポジトリURLを次のように変更する必要があります。

git@company:abc1234/demo.git

構成ファイルで定義したように、github.comがエイリアス「company」に置き換えられていることに注意してください。

同様に、設定ファイルで提供されるエイリアスに応じて、個人アカウントのリポジトリのクローンURLを変更する必要があります。


10
この回答に複数回賛成できるといいのですが...これは問題に取り組む正しい方法であり、他のオプションよりも安全で高速です。よりスケーラブル(同じホスト名に異なるキーを定義することも可能)
guyarad '28 / 03/18

4
もう時間を無駄にしないでください、これが答えです。どうもありがとう。
ルイスミラネーゼ

2
私はこの答えをもっと早く見つけたことを本当に願っています...
ヒルディ、

2
素晴らしい説明!私にぴったりの作品。また、エイリアスを使用してリポジトリのクローンを作成し忘れた場合は、後でリモートの起点のURLを編集することができます。
tkahn

1
構成ファイルは(chmod 600)でなければならないため、出席のみを支払う
Christiano Matos

106
ssh-add ~/.ssh/xxx_id_rsa

追加する前に必ずテストしてください:

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

エラーの問題がある場合は、ファイルのセキュリティを変更すると役立つことがあります。

chmod 0600 ~/.ssh/xxx_id_rsa

4
これは私の意見では最も簡潔でエレガントなソリューションです。魅力のように働いた!
artur

@Boboをbashrcまたはbash_profile(またはMacで同等のもの)に配置できますか?
T0xicCode 2013年

6
chmod 0600の+
1-

私にとっては魅力のように働きました(そして0600パーマを忘れないでください)。
Dmytro Uhnichenko 2013年

1
Macのubuntuから来た、これはまさに私が必要としたものでした。
ハリオム2016

42
  1. SSHキーを生成します。

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. 別のSSHキーを生成します

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

    これで、2つの公開鍵(id_rsa.pubaccountB.pub)が~/.ssh/ディレクトリに存在するはずです。

    $ 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
    

詳細はこちら


24

ssh-agentの使用についてTuomasに同意します。また、仕事用に2つ目の秘密鍵を追加したかったのですが、このチュートリアルは私にとって魅力的なものでした。

手順は次のとおりです。

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key 例えば ssh-add ~/.ssh/id_rsa
  3. 確認する $ ssh-add -l
  4. $ssh -v <host url>たとえば、それをテストしますssh -v git@assembla.com

4
ssh-agent長年使用してきたが、最近gnome-keyring、私のi3wm 内でGnomeを使用するように切り替えた。理由は簡単です。Gnomeのキーリングマネージャーは、sshキーの追加と削除を自動的に処理するので、覚えておく必要はありませんssh-add。さらに、それらをロック解除するための単一のパスワードを提供します(およびセキュリティのために、指定された時間にタイムアウトします)。それぞれ自分自身に。私はArchでgnome設定を使用しているため、私の設定ではプラグアンドプレイでした。あなたが反ノームであるなら、このコメントを無視してください。
eduncan911 2015年

@ eduncan911、私はgnome-keyringが役立つことに同意しますが、実際にはed25519キーを処理しないため、私にとっては初心者ではありません。更新:wiki.archlinux.org/index.php/GNOME/…から、システムのssh-agentを使用するようになりました。これで問題はなくなりました。
ブライアンミントン2018

15

2つのBitbucketアカウントがあり、両方に個別のSSHキーを保存する必要があったとき、私はしばらく前にこの問題に遭遇しました。これは私のために働いたものです。

次のように2つの個別の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 @ personal .bitbucket.org:name / personalproject.git

詳細については、このリンクを参照してください。



11

現在、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/*

1

あなたは、名前の設定ファイルを作成することができconfig、あなたの中に~/.sshフォルダを。以下を含むことができます:

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

これにより、このようなマシンに接続できます

 ssh aws

idFileはどのような形式をとりますか?絶対パス。例を挙げていただけますか
ピーター・モーテンセン

1

GITHUBの複数の鍵ペア

1.0 SSH設定ファイル

1.1作成〜/ .ssh / config

1.2 chmod 600〜/ .ssh / config(必須)

1.3以下をファイルに入力します。

ホストピザ

HostName github.com

PreferredAuthentications publickey#オプション

IdentityFile〜/ .ssh / privatekey1

ケースA:FRESH NEW GIT CLONE

このコマンドを使用してgit cloneします。

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

注:将来.ssh / configのホスト名「pizza」を変更する場合は、gitクローンフォルダーに移動し、.git / configファイルのurl行を編集します(ケースBを参照)

ケースB:GIT CLONE FOLDERがすでにある

2.1クローンされたフォルダに移動し、次に.gitフォルダに移動します

2.2設定ファイルを編集する

2.3 URLを古いものから新しいものに更新します。

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

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


1

私にとって唯一の実用的な解決策は、単に追加することでした ~/.ssh/config

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_key 拡張子なし、使用しないでください .pub


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エージェントを起動する場合があります。


1

のUbuntu 18.04(バイオニックビーバーは)何の関係もありません。

2番目の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

0

複数のsshキーを維持するために、この sshmulti npmパッケージを試すことができます。


このような場合にはnpmを使用しないことを強くお勧めします。これには一連の依存関係があり、簡単に調べると、数年前のパッケージである一匹狼の開発者が含まれています。sshmulti npmページ自体は、テストされていないことを宣言しています。
Jack Wasey

0

これは、@ sajib-khanの回答からヒントを得て使用したソリューションです。デフォルトの構成は設定されていません。これはgitlabの個人アカウントであり、指定されたもう1つは会社アカウントです。ここで私がしたこと:

sshキーを生成する

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

ssh設定を編集する

nano ~/.ssh/config

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

キャッシュされたSSHキーを削除する

ssh-add -D

試して !

ssh -T git@company.gitlab.com

GitLabへようこそ、@ hugo.sohm!

ssh -T git@gitlab.com

@HugoSohmのGitLabへようこそ!

これを使って !

企業アカウント

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

個人/デフォルトのアカウント

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

これが私が使用したソースです、それが役に立てば幸いです!


0

〜/ .ssh / configに以下を設定するアプローチが大好きです:

# Config 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 repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `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)。


0

のCentOS 6.5がOpenSSH_5.3p1とOpenSSL 1.0.1e-FIPSを実行している、私はそれらのいずれもが、デフォルトの名前がなかったので、私のキーファイルの名前を変更することで問題を解決しました。

私の.sshディレクトリにはid_rsa_fooとid_rsa_barが含まれていますが、id_rsaなどは含まれていません。


そして、キーはどのように使用されますか?自動検出はありますか?
robsch

特定のホストに正しいキーを選択する方法については、Randal Schwartzの回答を参照してください。stackoverflow.com/ questions / 2419566 /…
Chris Owens

はい、それはそれをより明確にします。-iオプションを使用しても、のような結果になる可能性がありますno such identity: /home/embo/.ssh/id_rsa: No such file or directory
ピーターモーテンセン

0

上で述べたようにアトラシアンブログページ、生成する設定内のファイルの.ssh次のテキストを含め、フォルダを:

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

次に、サフィックスドメインを使用してチェックアウトし、プロジェクト内で作成者名などをローカルで構成できます。

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