एकाधिक SSH सार्वजनिक कुंजी का उपयोग करना


97

मेरा व्यक्तिगत खाता है और अनफुल्ड पर एक कंपनी खाता है। Unfuddle SSH कुंजियों पर केवल एक ही खाते का उपयोग किया जा सकता है, इसलिए मुझे दोनों खातों के लिए अपने लैपटॉप पर एक अलग SSH कुंजी बनाने की आवश्यकता है। मैं ssh-keygen -t rsaअलग-अलग नामों से दो चाबियां बनाने के लिए दौड़ा (व्यक्तिगत डिफ़ॉल्ट नाम है और कंपनी {कंपनी} _rsa) है। अब समस्या यह है कि यह प्रतीत होता है कि मेरी डिफ़ॉल्ट कुंजी हर जगह उपयोग की जाती है और मुझे यह पता नहीं चल सकता है कि व्यक्तिगत बीओ के लिए गिट में उपयोग करने के लिए एक कुंजी कैसे निर्दिष्ट करें।

तो मेरा सवाल यह है कि मैं रेपो-टू-रेपो आधार पर उपयोग करने के लिए SSH कुंजी कैसे निर्दिष्ट करूं?

मैंने अपना ssh_config (~ / .ssh / config) सेटअप किया है, लेकिन यह अभी भी काम नहीं करता है।

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 config या मेरे git config में कुछ गड़बड़ है।


आपका ssh कॉन्फिगर सही दिखता है, मैं एक समान कॉन्फ़िगरेशन का उपयोग कर रहा हूं।
पाओलो एबरमन

जवाबों:


109

यदि आपके पास एक सक्रिय ssh- एजेंट है जिसमें आपकी id_rsaकुंजी भरी हुई है, तो समस्या यह है कि ssh पहले उस कुंजी को दे रहा है। Unfuddle शायद इसे प्रमाणीकरण के लिए स्वीकार करता है (उदाहरण के लिए sshd में ), लेकिन कंपनी के रिपॉजिटरी तक पहुंचने के लिए प्राधिकरण के लिए इसे अस्वीकार कर देता है (उदाहरण के लिए वे जो भी आंतरिक सॉफ़्टवेयर का उपयोग प्राधिकरण के लिए करते हैं, संभवतः कुछ Gitolite के समान है)। शायद कंपनी खाते में आपकी व्यक्तिगत कुंजी जोड़ने का एक तरीका है (कई लोग एक ही corp_rsaसार्वजनिक और निजी कुंजी फ़ाइलों को साझा नहीं कर रहे हैं, वे हैं?)।


IdentitiesOnly .ssh/configविन्यास कीवर्ड कुंजी है कि सीमित करने के लिए इस्तेमाल किया जा सकता ssh दूरस्थ करने के लिए प्रदान करता है 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

7
यदि आपके पास एक ही Unfuddle उपडोमेन (विभिन्न SSH कुंजियों के साथ) पर कई खाते हैं, तो आपको दूसरी विधि का उपयोग करने की आवश्यकता होगी।
लीवोबैटो

मेरे जिओलाइट सेटअप में मेरे लिए आइडेंटिटीली आवश्यक था, धन्यवाद!
कोएन।

1
बहुत बढ़िया इस समस्या को हल करता है कि मेरी सभी चाबियां जीथूब को भेज दी जाएं। हालाँकि, OS XI पर मेरे पासफ़्रेज़ में हर बार टाइप करना होता है। क्या यह कहने का कोई तरीका है कि विन्यास में निर्दिष्ट कुंजी का उपयोग करें लेकिन ssh एजेंट का उपयोग जारी रखें?
आकर्षित किया

1
@ ड्रू: यदि कुंजी पहले से ही एजेंट में लोड है, तो कमांड को अभी भी एजेंट से आकर्षित करना चाहिए। क्या आप सुनिश्चित हैं कि आपकी कुंजी पहले से भरी हुई है? ssh-add -lइससे पहले कि आप अपने Git होस्ट उपनाम का उपयोग करें की जाँच करें । इसके अलावा सार्वजनिक कुंजी फ़ाइल को प्रस्तुत करने की आवश्यकता है ताकि ssh उस कुंजी को पहचान सके जो ssh-Agent स्टोर कर रहा है। आप .pubकिसी कमांड जैसी खोई हुई फ़ाइल को पुनः प्राप्त कर सकते हैं ssh-keygen -f blah -y > blah.pub
क्रिस जॉन्सन

हाँ यह वहाँ है। जब मैंने IdentitiesOnly कॉल को हटा दिया, तो यह github 4 अलग-अलग कुंजी (सही एक w / o पासफ़्रेज़ के लिए पूछ सहित) भेजता है। जब मैं कॉल जोड़ता हूं, तो यह केवल एक कुंजी भेजता है, लेकिन हर बार पासफ़्रेज़ का अनुरोध करता है। यहां तक ​​कि जब मैं 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 और host gitorious.org: जैसे git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git आप अपने होस्ट में url के एक भाग से कैसे मेल खाते हैं? (आम तौर पर ~ मेरे लिए revelut)

@ अगर मैं SSH कॉन्फिग को company_unfuddle देता हूं तो क्या मेरा URL git @ company_unfuddle: {company} /overall.git होना चाहिए? @ ब्रूस - मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। क्या आप थोड़ा और विस्तार कर सकते हैं?

3

IdentityFile और IdentitiesOnly अच्छा काम करते हैं। कनेक्ट करने के लिए मुझे अलग-अलग होस्ट नामों का उपयोग करने के लिए याद रखने के लिए क्या याद आ रहा है, और यह तथ्य कि फॉरवर्ड एजेंट कनेक्शन अभी भी सभी कुंजी रखता है, जिसका अर्थ है कि यदि दूरस्थ होस्ट से समझौता किया जाता है, तो वे मेरी पहचान के किसी भी उपयोग कर सकते हैं जब मैं अंदर हूं ।

मैंने हाल ही में उपयोग करना शुरू किया है:

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

यह ssh के आसपास एक आवरण है, यह:

  • आपके द्वारा परिभाषित प्रत्येक पहचान के लिए एक पूरी तरह से अलग एजेंट रखता है।
  • स्वचालित रूप से लॉगिन सत्रों में एजेंटों को साझा करता है, आपके .bashrc में करने के लिए कुछ भी नहीं है।
  • पहली बार मांग करने पर एजेंट और संबंधित कुंजी को लोड करता है।
  • निर्धारित करता है कि किस एजेंट को ssh कमांड लाइन (hostname और ऐसे) या आपके वर्तमान वर्किंग डायरेक्टरी के आधार पर उपयोग करना है। यह विशेष रूप से आसान है क्योंकि मैं जो कर रहा हूं उसके आधार पर मैं अलग-अलग रास्तों से काम करता हूं।

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

स्पष्टीकरण: यदि आपके पास अपनी ~ / .shsh निर्देशिका में निजी कुंजी है, तो ssh-Agent का उपयोग नहीं किया जाएगा। इसलिए हम दूसरे नाम के तहत सार्वजनिक कुंजी बनाते हैं, ताकि ssh को ssh-agent का उपयोग करने के लिए मजबूर किया जाए। यह भी मदद करता है अगर आपके पास निजी कुंजी तक पहुँच नहीं है (जैसे ssh एजेंट अग्रेषण)


यह हो सकता है ssh-add -L, नहीं ssh-agent
Ives

@ धन्यवाद, निश्चित
वानुअन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.