Cara terbaik untuk menggunakan beberapa kunci pribadi SSH pada satu klien


871

Saya ingin menggunakan beberapa kunci pribadi untuk terhubung ke server yang berbeda atau bagian yang berbeda dari server yang sama (penggunaan saya adalah administrasi sistem server, administrasi Git, dan penggunaan Git normal dalam server yang sama). Saya mencoba hanya menumpuk kunci dalam id_rsafile tetapi tidak berhasil.

Tampaknya cara mudah untuk melakukan ini adalah dengan menggunakan perintah

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

Itu cukup merepotkan.

Ada saran tentang bagaimana cara melakukan ini sedikit lebih mudah?


1
Saya menulis artikel ini yang membahas berbagai konfigurasi dan kekuatan / kekurangannya.
Raffi

Jawaban:


1234

Dari saya .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

Dan seterusnya.


25
Terima kasih Randal! Saya melakukan beberapa penggalian ke .ssh / config dan menemukan ini: github.com/guides/multiple-github-accounts Menunjuk saya ke arah yang benar.
Justin

6
Ini sangat membantu (selain stackoverflow.com/a/3828682/169153 ). Jika Anda ingin menggunakan kunci dempul, ikuti dokumen ini di sini: blog.padraigkitterick.com/2007/09/16/…
Urda

2
Saya menemukan posting ini sangat membantu. Satu kesalahan yang saya buat saat membuat file config adalah saya meletakkan file .txt di folder .ssh alih-alih menjalankan perintah "touch" untuk membuat file config.
M_x_r

53
Perhatikan bahwa Anda juga dapat menentukan beberapa IdentityFileentri untuk hal yang sama Host, yang kemudian dicoba secara berurutan saat menghubungkan.
sschuberth

12
Gunakan IdentitiesOnly yesuntuk mencegah ~ / .ssh / id_rsa atau identitas lainnya. (Ini awalnya suntingan)
user3338098

370

Anda dapat menginstruksikan ssh untuk mencoba beberapa tombol secara berurutan saat menghubungkan. Begini caranya:

$ 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 ~]$

Dengan cara ini Anda tidak perlu menentukan kunci apa yang berfungsi dengan server mana. Itu hanya akan menggunakan kunci kerja pertama.

Anda juga hanya akan memasukkan frasa sandi jika server yang diberikan bersedia menerima kunci. Seperti yang terlihat di atas ssh tidak mencoba untuk meminta kata sandi .ssh/id_rsabahkan jika ada.

Tentunya itu tidak mengalahkan konfigurasi per-server seperti pada jawaban lain, tetapi setidaknya Anda tidak perlu menambahkan konfigurasi untuk semua dan setiap server yang Anda hubungkan!


13
Ini adalah solusi yang fantastis untuk pertanyaan yang diajukan, tetapi tidak cukup memenuhi kebutuhan yang diinginkan si penanya. Bagi saya, itu adalah solusi yang tepat dan sangat memenuhi kebutuhan untuk "Cara terbaik untuk menggunakan beberapa kunci pribadi SSH pada satu klien".
Wade

2
Ini sepertinya tidak berfungsi di bawah deklarasi Host di file konfigurasi
Maksim Luzik

30
Ini tidak bekerja dengan baik pada git, seolah-olah Anda memiliki dua kunci github deploy, yang pertama dalam daftar valid dan akan berfungsi, tetapi kemudian github akan mengeluh bahwa repositori tidak cocok.
Adam Reis

1
Jika SFTP / server target memiliki kebijakan keamanan yang mengunci akun (katakanlah setelah 3 upaya koneksi gagal), apakah ini tidak akan mengunci akun. Koneksi dicoba, tetapi dengan file 'kunci salah'
alchemist.gamma

7
Berhati-hatilah jika Anda memiliki sesuatu seperti fail2ban di server tersebut. Anda mungkin berakhir di salah satu penjara ... karena upaya gagal yang dihasilkan oleh kunci lainnya ...
Piccolo

254

The jawaban dari Randal Schwartz hampir membantu saya sepanjang jalan. Saya memiliki nama pengguna yang berbeda di server, jadi saya harus menambahkan kata kunci Pengguna ke file saya:

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

Sekarang Anda dapat terhubung menggunakan nama ramah:

ssh friendly-name

Lebih banyak kata kunci dapat ditemukan di halaman manual OpenSSH . CATATAN: Beberapa kata kunci yang tercantum mungkin sudah ada di file / etc / ssh / ssh_config Anda .


Jika saya tidak salah pengguna, Anda biasanya menentukan langsung di url saat menghubungkan dengan user @ host
a1an

3
Saya lebih suka menggunakan kata kunci 'Port' juga. Kata kunci lain yang menarik adalah 'StrictHostKeyChecking'.
Ethan

122

Jawaban sebelumnya telah menjelaskan cara membuat file konfigurasi dengan benar untuk mengelola beberapa kunci ssh. Saya pikir, hal penting yang juga perlu dijelaskan adalah penggantian nama host dengan nama alias saat kloning repositori .

Misalkan, nama pengguna akun GitHub perusahaan Anda adalah abc1234 . Dan anggaplah nama pengguna akun GitHub pribadi Anda adalah jack1234

Dan, misalkan Anda telah membuat dua kunci RSA, yaitu id_rsa_company dan id_rsa_personal . Jadi, file konfigurasi Anda akan terlihat seperti di bawah ini:

# 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

Sekarang, ketika Anda mengkloning repositori (bernama demo) dari akun GitHub perusahaan, URL repositori akan menjadi seperti:

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

Sekarang, sambil melakukan git clone, Anda harus memodifikasi URL repositori di atas sebagai:

git@company:abc1234/demo.git

Perhatikan bagaimana github.com sekarang diganti dengan alias "perusahaan" seperti yang telah kita tentukan dalam file konfigurasi.

Sama halnya, Anda harus memodifikasi URL klon dari repositori di akun pribadi tergantung pada alias yang disediakan dalam file konfigurasi.


10
Saya berharap saya dapat meningkatkan jawaban ini lebih dari sekali ... ini adalah cara yang tepat untuk mendekati masalah ini, dan ini lebih aman dan lebih cepat daripada opsi lain. Lebih scalable juga (memungkinkan untuk menentukan kunci yang berbeda untuk nama host yang sama )
guyarad

4
Buang-buang waktu lagi, inilah jawabannya. Terimakasih banyak.
Luis Milanese

2
Saya benar-benar berharap saya menemukan jawaban ini sebelumnya ... tetapi lebih baik terlambat daripada tidak, Terima kasih banyak!
Hildy

2
Penjelasan hebat! Berfungsi sempurna untuk saya. Dan jika Anda lupa untuk mengkloning repo dengan alias Anda sering dapat mengedit url asal yang jauh sesudahnya.
tkahn

1
hanya membayar perhatian karena file config harus (chmod 600)
Christiano Matos

106
ssh-add ~/.ssh/xxx_id_rsa

Pastikan Anda mengujinya sebelum menambahkan dengan:

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

Jika Anda memiliki masalah dengan kesalahan terkadang mengubah keamanan file membantu:

chmod 0600 ~/.ssh/xxx_id_rsa

4
Ini adalah solusi paling ringkas dan elegan menurut saya. Bekerja seperti pesona!
artur

@ Bob bisa Anda letakkan di bashrc atau bash_profile (atau apa pun yang setara dengan mac)?
T0xicCode

6
+1 untuk chmod 0600 - masalah izin mencegah saya menghubungkan
amacy

Bekerja seperti pesona bagi saya (dan jangan lupa tentang 0600 perm).
Dmytro Uhnichenko

1
Datang dari ubuntu di mac dan ini persis apa yang saya butuhkan.
hariom

42
  1. Hasilkan kunci SSH:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. Buat kunci SSH lain :

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

    Sekarang, dua kunci publik ( id_rsa.pub , accountB.pub ) harus ada di ~/.ssh/direktori.

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory
    
  3. Buat file konfigurasi ~/.ssh/configdengan konten berikut:

    $ 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. Klon dari defaultakun.

    $ git clone git@bitbucket.org:username/project.git
    
  5. Klon dari accountBakun.

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

Lihat Lebih Banyak Di Sini


24

Saya setuju dengan Tuomas tentang menggunakan ssh-agent. Saya juga ingin menambahkan kunci pribadi kedua untuk bekerja dan tutorial ini berfungsi seperti pesona bagi saya.

Langkah-langkahnya adalah sebagai berikut:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key misalnya ssh-add ~/.ssh/id_rsa
  3. Verifikasi oleh $ ssh-add -l
  4. Uji dengan $ssh -v <host url> misalnyassh -v git@assembla.com

4
Setelah digunakan ssh-agentselama bertahun-tahun, saya baru saja beralih menggunakan Gnome gnome-keyringdalam i3wm saya . Alasannya sederhana: Manajer Keyring Gnome secara otomatis menangani menambah dan menghapus kunci ssh tanpa harus saya ingat ssh-add. Selain itu memberi saya satu kata sandi untuk membukanya (dan batas waktu pada waktu yang ditentukan, untuk keamanan). Untuk masing-masing miliknya. Karena saya menggunakan pengaturan gnome di Arch, itu plug and play dengan setup saya. Jika Anda anti-gnome, abaikan komentar ini.
eduncan911

@ eduncan911, saya setuju bahwa gnome-keyring dapat membantu, tetapi tidak benar-benar menangani kunci ed25519, sehingga bagi saya adalah non-starter. Pembaruan: Saya melihat dari wiki.archlinux.org/index.php/GNOME/… bahwa sekarang menggunakan ssh-agent sistem sehingga tidak lagi menjadi masalah.
Brian Minton

15

Saya telah mengalami masalah ini beberapa waktu lalu, ketika saya memiliki dua akun Bitbucket dan ingin harus menyimpan kunci SSH yang terpisah untuk keduanya. Inilah yang bekerja untuk saya.

Saya membuat dua konfigurasi ssh terpisah sebagai berikut.

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

Sekarang ketika saya harus mengkloning repositori dari akun kantor saya - perintahnya adalah sebagai berikut.

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

Saya harus mengubah perintah ini menjadi:

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

Demikian pula perintah klon dari akun pribadi saya harus dimodifikasi

git clone git @ personal .bitbucket.org: name / personalproject.git

Lihat tautan ini untuk informasi lebih lanjut.



11

Sekarang, dengan Git versi terbaru, kita dapat menentukan sshCommand di file konfigurasi Git khusus repositori:

  [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

Anda dapat membuat file konfigurasi dengan nama configdi ~/.sshfolder Anda . Ini dapat berisi:

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

Ini akan memungkinkan Anda untuk terhubung ke mesin seperti ini

 ssh aws

Bentuk apa yang diambil idFile? Jalan absolut. Bisakah Anda memberikan contoh
Peter Mortensen

1

PENTING: Anda harus memulai ssh-agent

Anda harus memulai ssh-agent (jika belum berjalan) sebelum menggunakan ssh-add sebagai berikut:

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # Where id_rsa_2 is your new private key file

Perhatikan bahwa perintah eval memulai agen pada Git Bash pada Windows. Lingkungan lain dapat menggunakan varian untuk memulai agen SSH.


1

Di Ubuntu 18.04 (Bionic Beaver) tidak ada yang bisa dilakukan.

Setelah berhasil membuat kunci SSH kedua dengan sukses, sistem akan mencoba menemukan kunci SSH yang cocok untuk setiap koneksi.

Untuk lebih jelasnya, Anda dapat membuat kunci baru dengan perintah-perintah ini:

# 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

1

Beberapa pasangan kunci di GitHub

File konfigurasi SSH 1.0

1.1 Buat ~ / .ssh / config

1.2 chmod 600 ~ / .ssh / config ( harus )

1.3 Masukkan yang berikut ke dalam file:

Tuan rumah pizza

HostName github.com

PreferredAuthentications publickey # opsional

IdentityFile ~ / .ssh / privatekey1

Kasus A: Klon Git baru yang segar

Gunakan perintah ini untuk klon Git:

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

Catatan: Jika Anda ingin mengubah nama host "pizza" .ssh / config di masa mendatang, buka folder Git yang dikloning, edit baris file URL .git / config (lihat huruf B)

Kasus B: Sudah memiliki folder klon Git

2.1 Buka folder yang dikloning, dan kemudian masuk ke folder .git

2.2 Edit file konfigurasi

2.3 Perbarui URL dari * lama ke baru :

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

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


1

Bagi saya, satu-satunya solusi yang berfungsi adalah dengan menambahkan ini dalam file ~/.ssh/config:

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

your_ssh_keytanpa ekstensi apa pun. Jangan gunakan .pub.


0

Pada CentOS 6.5 menjalankan OpenSSH_5.3p1 dan OpenSSL 1.0.1e-fips, saya memecahkan masalah dengan mengganti nama file kunci saya sehingga tidak ada yang memiliki nama default.

Direktori .ssh saya berisi id_rsa_foo dan id_rsa_bar, tetapi tidak ada id_rsa, dll.


Dan bagaimana kunci digunakan? Apakah ada deteksi otomatis?
robsch

Lihat jawaban Randal Schwartz untuk cara memilih kunci yang benar untuk host yang diberi stackoverflow.com/questions/2419566/…
Chris Owens

Ya, itu membuatnya lebih eksplisit. Bahkan menggunakan -iopsi dapat menghasilkan sesuatu seperti no such identity: /home/embo/.ssh/id_rsa: No such file or directory.
Peter Mortensen

0

Seperti yang disebutkan di halaman blog Atlassian , buat file config di dalam folder .ssh , termasuk teks berikut:

#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

Kemudian Anda cukup checkout dengan domain suffix dan dalam proyek Anda dapat mengkonfigurasi nama penulis, dll secara lokal.


0

Inilah solusi yang saya gunakan terinspirasi dari jawaban sajib-khan . Konfigurasi default tidak diatur; ini akun pribadi saya di GitLab dan yang lainnya ditentukan adalah akun perusahaan saya. Inilah yang saya lakukan:

Hasilkan kunci SSH

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

Edit konfigurasi SSH

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

Hapus kunci SSH yang di-cache

ssh-add -D

Menguji!

ssh -T git@company.gitlab.com

Selamat datang di GitLab, @ hugo.sohm!

ssh -T git@gitlab.com

Selamat datang di GitLab, @HugoSohm!

Gunakan!

Akun perusahaan

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

Akun pribadi / default

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

Berikut adalah sumber yang saya gunakan.


0

Saya suka pendekatan untuk mengatur yang berikut ini di file ~ / .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

Kemudian di repositori Anda, Anda dapat membuat .envfile yang berisi sshperintah yang akan digunakan:

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

Jika Anda kemudian menggunakan misalnya dotenv variabel lingkungan lingkungan diekspor secara otomatis dan teriakan teriakan, Anda dapat menentukan kunci yang Anda inginkan per proyek / direktori. Frasa sandi hanya diminta satu kali karena ditambahkan ke gantungan kunci.

Solusi ini bekerja sempurna dengan Git dan dirancang untuk bekerja pada Mac (karena UseKeychain).


-1

Anda dapat mencoba paket sshmulti npm ini untuk mempertahankan beberapa kunci SSH.


Saya sangat merekomendasikan untuk tidak menggunakan npm untuk hal seperti ini. Itu memiliki kaskade dependensi, yang, pada inspeksi singkat, termasuk berbagai pengembang sendirian, paket beberapa tahun. Halaman sshmulti npm sendiri menyatakan bahwa ia belum teruji.
Jack Wasey
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.