Menggunakan Beberapa Kunci Publik SSH

97

Saya memiliki akun pribadi dan akun perusahaan di Unfuddle. Pada Unfuddle kunci SSH hanya dapat digunakan pada satu akun, jadi saya perlu membuat kunci SSH terpisah pada laptop saya untuk kedua akun. Saya berlari ssh-keygen -t rsauntuk menghasilkan dua kunci dengan nama yang berbeda (personal adalah nama default dan perusahaan adalah {company} _rsa). Masalahnya sekarang adalah tampaknya kunci default saya digunakan di mana-mana dan saya tidak bisa menemukan cara menentukan kunci untuk digunakan dalam Git untuk setiap repo.

Jadi pertanyaan saya adalah: Bagaimana cara menentukan kunci SSH untuk digunakan berdasarkan repo-ke-repo?

Saya mengatur ssh_config saya (~ / .ssh / config) tetapi sepertinya masih tidak berfungsi.

konfigurasi:

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

File konfigurasi repo Git saya untuk repo di akun unfuddle perusahaan saya terlihat seperti ini:

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

Jadi saya tidak yakin apakah ada sesuatu yang salah dengan konfigurasi ssh saya atau konfigurasi git saya.

Dave Long
sumber
Konfigurasi ssh Anda terlihat benar, saya menggunakan konfigurasi yang sama.
Paŭlo Ebermann

Jawaban:

109

Jika Anda memiliki ssh-agent aktif yang id_rsamemuat kunci Anda , maka masalahnya kemungkinan bahwa ssh menawarkan kunci itu terlebih dahulu. Unfuddle mungkin menerimanya untuk otentikasi (misalnya dalam sshd ) tetapi menolaknya untuk otorisasi untuk mengakses repositori perusahaan (misalnya dalam perangkat lunak internal apa pun yang mereka gunakan untuk otorisasi, mungkin sesuatu yang mirip dengan Gitolite). Mungkin ada cara untuk menambahkan kunci pribadi Anda ke akun perusahaan (beberapa orang tidak berbagi corp_rsafile kunci publik dan pribadi yang sama , bukan?).


Kata IdentitiesOnly .ssh/configkunci konfigurasi dapat digunakan untuk membatasi kunci yang ssh tawarkan ke sshd jarak jauh hanya untuk yang ditentukan melalui IdentityFilekata kunci (yaitu akan menolak untuk menggunakan kunci tambahan apa saja yang kebetulan dimuat ke agen ssh aktif ).

Coba .ssh/configbagian ini :

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

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

Kemudian, gunakan URL Git seperti ini:

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

Jika Anda ingin memanfaatkan sepenuhnya .ssh/configmekanisme ini, Anda dapat memberikan nama host kustom Anda sendiri dan mengubah nama pengguna default:

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

Kemudian, gunakan URL Git seperti ini:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
Chris Johnsen
sumber
7
Jika Anda memiliki beberapa akun di subdomain Unfuddle yang sama (dengan kunci SSH berbeda), Anda harus menggunakan metode kedua.
leolobato
IdentitiesOnly sangat penting bagi saya dalam pengaturan gitolite saya, terima kasih!
Koen.
1
Hebat ini memperbaiki masalah bahwa semua kunci saya dikirim ke github. Namun, pada OS XI saya harus mengetikkan frasa sandi saya setiap saat. Apakah ada cara untuk mengatakan hanya menggunakan kunci yang ditentukan dalam konfigurasi tetapi terus menggunakan agen ssh?
Drew
1
@Rew: Jika kunci sudah dimuat ke agen, maka perintah tersebut masih harus menariknya dari agen. Apakah Anda yakin kunci Anda sudah dimuat sebelumnya? Periksa ssh-add -lsebelum Anda menggunakan alias host Git Anda. Juga file kunci publik harus ada sehingga ssh dapat mengenali kunci yang disimpan oleh ssh-agent . Anda dapat membuat ulang .pubfile yang hilang dengan perintah seperti ssh-keygen -f blah -y > blah.pub.
Chris Johnsen
Ya itu di sana. Ketika saya menghapus panggilan IdentitiesOnly, ia mengirim github 4 kunci yang berbeda (termasuk yang benar tanpa meminta frasa sandi). Ketika saya menambahkan panggilan, itu hanya mengirim satu kunci tetapi meminta kata sandi setiap kali. Bahkan ketika saya memberi tahu OSX untuk menyimpan nilai frasa sandi di gantungan kuncinya.
Drew
3

man ssh_config

Sesuatu seperti

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

Dan gunakan personal_reposebagai host di repo git Anda.

Reactormonk
sumber
Tass, dapatkah Anda meninjau perubahan yang saya buat di atas? Saya menambahkan ssh_config dan konfigurasi git saya.
Hosthanya pengidentifikasi - tidak perlu nama domain lengkap. Itu mungkin menciptakan beberapa bug tersembunyi. Jika Anda mengubahnya, Anda tidak perlu mengeja nama lengkap di konfigurasi git Anda.
untuk gitorious, user = git dan host gitorious.org: misalnya [email protected]: ~ revelut / qt / bruce-sandbox-qt.git Bagaimana Anda mencocokkan di Host Anda bagian dari url? (biasanya ~ revelut untuk saya)
@Tass jadi jika saya memberikan nama company_unfuddle ke konfigurasi SSH haruskah URL saya menjadi git @ company_unfuddle: {company} /overall.git? @ Bruce - Saya tidak yakin apa yang Anda minta. Bisakah Anda mengembangkan lebih sedikit?
3

IdentityFile dan IdentitiesHanya berfungsi dengan baik. Apa yang mengganggu saya harus ingat untuk menggunakan nama host yang berbeda untuk terhubung, dan fakta bahwa koneksi agen yang diteruskan masih memegang semua kunci, yang berarti bahwa jika host jarak jauh dikompromikan, mereka dapat menggunakan identitas saya saat saya di .

Saya baru-baru ini mulai menggunakan:

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

ini adalah pembungkus ssh, itu:

  • menyimpan agen yang sepenuhnya terpisah untuk setiap identitas yang Anda tetapkan.
  • secara otomatis membagikan agen di seluruh sesi login, tidak ada hubungannya di .bashrc Anda.
  • memuat agen dan kunci terkait sesuai permintaan saat pertama kali Anda membutuhkannya.
  • menentukan agen mana yang digunakan berdasarkan ssh command line (nama host & semacamnya) atau direktori kerja Anda saat ini. Ini sangat berguna karena saya cenderung bekerja dari jalur yang berbeda tergantung pada apa yang saya lakukan.
MarkMo
sumber
0

Berikut cara yang tepat jika Anda ingin menggunakan ssh agent:

# 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

Penjelasan: jika Anda memiliki kunci pribadi di direktori ~ / .ssh Anda, ssh-agent tidak akan digunakan. Jadi kami membuat kunci publik dengan nama lain, sehingga ssh terpaksa menggunakan ssh-agent. Ini juga membantu jika Anda tidak memiliki akses ke kunci pribadi (mis. Penerusan ssh agent)

Vanuan
sumber
ini mungkin ssh-add -L, bukan ssh-agent.
ives
@ives terima kasih, diperbaiki
Vanuan