การใช้กุญแจสาธารณะ SSH หลายอัน


97

ฉันมีบัญชีส่วนบุคคลและบัญชี บริษัท ใน Unfuddle ในคีย์ Unfuddle SSH สามารถใช้ได้กับบัญชีเดียวเท่านั้นดังนั้นฉันต้องสร้างคีย์ SSH แยกต่างหากบนแล็ปท็อปของฉันสำหรับทั้งสองบัญชี ฉันวิ่งssh-keygen -t rsaไปเพื่อสร้างสองปุ่มที่มีชื่อแตกต่างกัน (ส่วนตัวคือชื่อเริ่มต้นและ บริษัท คือ {company} _rsa) ปัญหาในตอนนี้คือปรากฏว่าใช้คีย์เริ่มต้นของฉันทุกที่และฉันไม่สามารถหาวิธีระบุคีย์ที่จะใช้ใน Git สำหรับแต่ละ repos

ดังนั้นคำถามของฉันคือฉันจะระบุคีย์ SSH เพื่อใช้บนพื้นฐาน repo-to-repo ได้อย่างไร

ฉันตั้งค่า 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

ไฟล์การกำหนดค่า repo Git ของฉันสำหรับการซื้อซ้ำในบัญชี บริษัท ที่ยังไม่ได้ทำของฉันมีลักษณะดังนี้:

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

ดังนั้นฉันไม่แน่ใจว่ามีบางอย่างผิดปกติกับ ssh config หรือ git config ของฉัน


การกำหนดค่า ssh ของคุณถูกต้องฉันกำลังใช้การกำหนดค่าที่คล้ายกัน
Paŭlo Ebermann

คำตอบ:


109

หากคุณมีเอเจนต์ ssh ที่ใช้งานอยู่ซึ่งid_rsaโหลดคีย์ของคุณอยู่แสดงว่าปัญหาน่าจะเป็นที่sshเสนอคีย์นั้นก่อน Unfuddle อาจยอมรับมันสำหรับการรับรองความถูกต้อง (เช่นในsshd ) แต่ปฏิเสธมันสำหรับการให้สิทธิ์ในการเข้าถึงที่เก็บข้อมูลของ บริษัท (เช่นซอฟแวร์ภายในที่พวกเขาใช้สำหรับการอนุญาต อาจมีวิธีเพิ่มคีย์ส่วนบุคคลของคุณไปยังบัญชี บริษัท (หลายคนไม่ได้แชร์ไฟล์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 ที่แตกต่างกัน) คุณจะต้องใช้วิธีที่สอง
leolobato

IdentitiesOnly เป็นสิ่งสำคัญสำหรับฉันในการตั้งค่า gitolite ของฉันขอบคุณ!
โคเอ็น

1
ดีเลิศนี้แก้ไขปัญหาที่กุญแจทั้งหมดของฉันถูกส่งไปยัง Github อย่างไรก็ตามใน OS XI ต้องพิมพ์ข้อความรหัสผ่านของฉันทุกครั้ง มีวิธีที่จะบอกว่าใช้เฉพาะคีย์ที่ระบุในการตั้งค่า แต่ยังคงใช้เอเจนต์ ssh หรือไม่?
Drew

1
@Drew: หากคีย์ถูกโหลดไปยังเอเจนต์แล้วคำสั่งควรจะดึงมันออกมาจากเอเจนต์ คุณแน่ใจหรือว่ากุญแจของคุณถูกโหลดไว้ล่วงหน้า ตรวจสอบssh-add -lก่อนที่จะใช้นามแฝงโฮสต์ Git นอกจากนี้ยังต้องมีไฟล์พับลิกคีย์เพื่อให้sshสามารถจดจำคีย์ที่เอเจนต์ sshเก็บอยู่ คุณสามารถงอกใหม่หายไปไฟล์ที่มีคำสั่งเช่น.pub ssh-keygen -f blah -y > blah.pub
Chris Johnsen

ใช่มันอยู่ในนั้น เมื่อฉันลบการโทร IdentitiesOnly มันจะส่ง github 4 คีย์ที่แตกต่างกัน (รวมถึงหนึ่งที่ถูกต้องโดยไม่ต้องขอรหัสผ่าน) เมื่อฉันเพิ่มการโทรมันจะส่งเพียงปุ่มเดียว แต่ร้องขอข้อความรหัสผ่านทุกครั้ง แม้ว่าฉันจะบอก OSX ให้เก็บค่ารหัสผ่านในพวงกุญแจ
Drew

3

man ssh_config

สิ่งที่ต้องการ

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

และใช้personal_repoเป็นโฮสต์ใน repo คอมไพล์ของคุณ


ใช่คุณสามารถตรวจสอบการเปลี่ยนแปลงที่ทำไว้ด้านบนได้หรือไม่ ฉันเพิ่ม ssh_config และ git config ของฉัน

Hostเป็นเพียงตัวระบุ - ไม่จำเป็นต้องใช้ชื่อโดเมนแบบเต็ม นั่นอาจสร้างบั๊กที่ซ่อนอยู่ หากคุณเปลี่ยนคุณไม่จำเป็นต้องสะกดชื่อเต็มในการกำหนดค่า git ของคุณ

สำหรับ gitorious, user = git และโฮสต์ gitorious.org: เช่น git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git คุณจับคู่โฮสต์ใน URL ของคุณอย่างไร? (โดยทั่วไปแล้ว ~ revelut สำหรับฉัน)

@Tass ดังนั้นหากฉันตั้งชื่อ company_unfuddle ให้กับการกำหนดค่า SSH URL ของฉันควรเป็น git @ company_unfuddle: {company} /overall.git? @ Bruce - ฉันไม่แน่ใจว่าสิ่งที่คุณถาม คุณช่วยขยายอีกหน่อยได้ไหม?

3

IdentityFile และ Identities ทำงานได้ดีเท่านั้น สิ่งที่รบกวนจิตใจฉันต้องจำไว้ว่าให้ใช้ชื่อโฮสต์ที่แตกต่างกันเพื่อเชื่อมต่อและความจริงที่ว่าการเชื่อมต่อตัวแทนส่งต่อยังคงมีคีย์ทั้งหมดซึ่งหมายความว่าหากโฮสต์ระยะไกลถูกบุกรุกพวกเขาสามารถใช้ข้อมูลประจำตัวของฉันใด ๆ .

ฉันเพิ่งเริ่มใช้:

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

มันเป็นเสื้อคลุมรอบ ssh มัน:

  • เก็บเอเจนต์แยกจากกันโดยสิ้นเชิงสำหรับแต่ละข้อมูลประจำตัวที่คุณกำหนด
  • แบ่งปันตัวแทนผ่านเซสชันการเข้าสู่ระบบโดยอัตโนมัติโดยไม่ต้องทำอะไรใน. 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
ives

@ives ขอบคุณคง
Vanuan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.