Sử dụng nhiều khóa công khai SSH


97

Tôi có tài khoản cá nhân và tài khoản công ty trên Unfuddle. Trên Unfuddle SSH key chỉ có thể được sử dụng trên một tài khoản, vì vậy tôi cần tạo một khóa SSH riêng biệt trên máy tính xách tay của mình cho cả hai tài khoản. Tôi đã chạy ssh-keygen -t rsađể tạo hai khóa với các tên khác nhau (cá nhân là tên mặc định và công ty là {company} _rsa). Vấn đề bây giờ là có vẻ như khóa mặc định của tôi được sử dụng ở mọi nơi và tôi không thể tìm ra cách chỉ định khóa để sử dụng trong Git cho từng repos riêng lẻ.

Vì vậy, câu hỏi của tôi là: Làm cách nào để chỉ định khóa SSH để sử dụng trên cơ sở repo-to-repo?

Tôi thiết lập ssh_config (~ / .ssh / config) nhưng dường như nó vẫn không hoạt động.

cấu hình:

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

Tệp cấu hình repo Git của tôi cho một repo trên tài khoản công ty của tôi giống như thế này:

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

Vì vậy, tôi không chắc chắn nếu có cái gì đó sai với cấu hình ssh hoặc cấu hình git của tôi.


Cấu hình ssh của bạn có vẻ đúng, tôi đang sử dụng một cấu hình tương tự.
Paŭlo Ebermann

Câu trả lời:


109

Nếu bạn có một tác nhân ssh hoạt động đã id_rsatải khóa của bạn , thì vấn đề có thể là ssh đang cung cấp khóa đó trước tiên. Unfuddle có thể chấp nhận nó để xác thực (ví dụ: trong sshd ) nhưng từ chối cấp phép để truy cập vào kho của công ty (ví dụ: trong bất kỳ phần mềm nội bộ nào họ sử dụng để ủy quyền, có thể giống với Gitolite). Có lẽ có một cách để thêm khóa cá nhân của bạn vào tài khoản công ty (nhiều người không chia sẻ cùng một corp_rsatệp khóa công khai và riêng tư, phải không?).


Các IdentitiesOnly .ssh/configtừ khóa cấu hình có thể được sử dụng để hạn chế các phím mà ssh Mời để điều khiển từ xa sshd để chỉ những quy định thông qua IdentityFilecác từ khóa (tức là nó sẽ từ chối sử dụng bất kỳ phím bổ sung mà xảy ra được nạp vào một hoạt động ssh-agent ).

Hãy thử các .ssh/configphần sau:

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

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

Sau đó, sử dụng URL Git như sau:

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

Nếu bạn muốn tận dụng tối đa .ssh/configcơ chế, bạn có thể cung cấp tên máy chủ tùy chỉnh của riêng mình và thay đổi tên người dùng mặc định:

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

Sau đó, sử dụng URL Git như sau:

uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git

7
Nếu bạn có nhiều tài khoản trên cùng một tên miền phụ Unfuddle (với các khóa SSH khác nhau), bạn sẽ cần sử dụng phương thức thứ hai.
leolobato

Danh tính Chỉ cần thiết cho tôi trong thiết lập gitolite của tôi, cảm ơn!
Koen.

1
Tuyệt vời này khắc phục vấn đề mà tất cả các khóa của tôi được gửi đến github. Tuy nhiên, trên OS XI phải gõ cụm mật khẩu của tôi mọi lúc. Có cách nào để nói chỉ sử dụng khóa được chỉ định trong cấu hình nhưng tiếp tục sử dụng tác nhân ssh không?
vẽ

1
@Drew: Nếu khóa đã được tải vào tác nhân, thì lệnh vẫn nên rút nó từ tác nhân. Bạn có chắc chắn khóa của bạn đã được tải sẵn? Kiểm tra với ssh-add -ltrước khi bạn sử dụng bí danh máy chủ Git của bạn. Ngoài ra, tệp khóa công khai cần phải có mặt để ssh có thể nhận ra khóa mà ssh-agent đang lưu trữ. Bạn có thể tạo lại một .pubtập tin bị mất bằng một lệnh như thế nào ssh-keygen -f blah -y > blah.pub.
Chris Johnsen

Vâng, nó ở trong đó. Khi tôi xóa cuộc gọi Nhận dạng, nó sẽ gửi github 4 khóa khác nhau (bao gồm cả một khóa chính xác để yêu cầu cụm mật khẩu). Khi tôi thêm cuộc gọi, nó chỉ gửi một phím nhưng yêu cầu cụm mật khẩu mọi lúc. Ngay cả khi tôi bảo OSX lưu trữ giá trị cụm mật khẩu trong móc khóa của nó.
vẽ

3

man ssh_config

Cái gì đó như

Host personal_repo
  User personal
  IdentityFile .ssh/personal_rsa

Host company_repo
  User company
  IdentityFile .ssh/company_rsa

Và sử dụng personal_reponhư máy chủ trong repo git của bạn.


Tass, bạn có thể xem lại những thay đổi của tôi ở trên không? Tôi đã thêm ssh_config và cấu hình git của tôi.

Hostchỉ là một định danh - không cần tên miền đầy đủ. Điều đó có thể tạo ra một số lỗi ẩn. Nếu bạn thay đổi điều đó, bạn không cần phải đánh vần tên đầy đủ trong cấu hình git của mình.

cho gitorious, user = git và host gitorious.org: vd: git@gitorious.org: ~ revelut / qt / bruce-sandbox-qt.git (thường là ~ revelut cho tôi)

@Tass vì vậy nếu tôi đặt tên company_unfuddle cho cấu hình SSH thì URL của tôi có phải là git @ company_unfuddle: {company} /overall.git không? @Bruce - Tôi không chắc bạn đang hỏi gì. Bạn có thể mở rộng thêm một chút không?

3

Danh tính và Danh tính Chỉ hoạt động tốt. Điều làm phiền tôi là phải nhớ sử dụng các tên máy chủ khác nhau để kết nối và thực tế là kết nối đại lý được chuyển tiếp vẫn giữ tất cả các khóa, có nghĩa là nếu máy chủ từ xa bị xâm phạm, họ có thể sử dụng bất kỳ danh tính nào của tôi khi tôi vào .

Gần đây tôi đã bắt đầu sử dụng:

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

đó là một trình bao bọc xung quanh ssh, nó:

  • giữ một tác nhân hoàn toàn riêng biệt cho mỗi danh tính bạn xác định.
  • tự động chia sẻ các đại lý qua các phiên đăng nhập, không có gì để làm trong .bashrc của bạn.
  • tải các tác nhân và các khóa tương ứng theo yêu cầu trong lần đầu tiên bạn cần chúng.
  • xác định tác nhân nào sẽ sử dụng dựa trên dòng lệnh ssh (tên máy chủ & ví dụ) hoặc thư mục làm việc hiện tại của bạn. Điều này đặc biệt tiện dụng vì tôi có xu hướng làm việc từ các con đường khác nhau tùy thuộc vào những gì tôi đang làm.

0

Đây là một cách thích hợp nếu bạn muốn sử dụng tác nhân 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

Giải thích: nếu bạn có khóa riêng trong thư mục ~ / .ssh, ssh-agent sẽ không được sử dụng. Vì vậy, chúng tôi tạo khóa công khai dưới tên khác, do đó ssh buộc phải sử dụng ssh-agent. Điều này cũng hữu ích nếu bạn không có quyền truy cập vào khóa riêng (ví dụ: chuyển tiếp đại lý ssh)


điều này có thể ssh-add -L, không ssh-agent.
ives

@ives cảm ơn, đã sửa
Vanuan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.