Cách tốt nhất để sử dụng nhiều khóa riêng SSH trên một máy khách


871

Tôi muốn sử dụng nhiều khóa riêng để kết nối với các máy chủ khác nhau hoặc các phần khác nhau của cùng một máy chủ (công dụng của tôi là quản trị hệ thống máy chủ, quản trị Git và sử dụng Git bình thường trong cùng một máy chủ). Tôi đã cố gắng đơn giản là sắp xếp các khóa trong các id_rsatập tin không có kết quả.

Rõ ràng một cách đơn giản để làm điều này là sử dụng lệnh

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

Điều đó khá cồng kềnh.

Bất kỳ đề xuất như làm thế nào để làm điều này dễ dàng hơn một chút?


1
Tôi đã viết bài viết này đi sâu vào các cấu hình khác nhau và các điểm mạnh / thiếu sót của chúng.
Raffi

Câu trả lời:


1234

Từ tôi .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

Và như thế.


25
Cảm ơn Randal! Tôi đã thực hiện một số nghiên cứu về .ssh / config và tìm thấy điều này: github.com/guides/multipl-github-accounts Chỉ cho tôi đi đúng hướng.
Justin

6
Đây là một trợ giúp tuyệt vời (ngoài stackoverflow.com/a/3828682/169153 ). Nếu bạn muốn sử dụng khóa putty, hãy theo dõi tài liệu này tại đây: blog.padraigkitterick.com/2007/09/16/ mẹo
Urda

2
Tôi thấy bài viết này rất hữu ích. Một lỗi tôi mắc phải khi tạo tệp cấu hình là tôi đặt tệp .txt vào thư mục .ssh thay vì chạy lệnh "chạm" để tạo tệp cấu hình.
M_x_r

53
Lưu ý rằng bạn cũng có thể chỉ định nhiều IdentityFilemục nhập cho cùng một mục Host, sau đó được thử theo thứ tự khi kết nối.
sschuberth

12
Sử dụng IdentitiesOnly yesđể ngăn ~ / .ssh / id_rsa hoặc bất kỳ danh tính nào khác. (Đây ban đầu là một bản chỉnh sửa)
user3338098 2/11/2015

370

Bạn có thể hướng dẫn ssh thử nhiều phím liên tiếp khi kết nối. Đây là cách thực hiện:

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

Bằng cách này, bạn không phải chỉ định khóa nào hoạt động với máy chủ nào. Nó sẽ chỉ sử dụng phím làm việc đầu tiên.

Ngoài ra, bạn sẽ chỉ nhập cụm mật khẩu nếu một máy chủ nhất định sẵn sàng chấp nhận khóa. Như đã thấy ở trên, ssh đã không thử hỏi mật khẩu cho.ssh/id_rsa ngay cả khi nó có .

Chắc chắn nó không vượt trội so với cấu hình trên mỗi máy chủ như trong các câu trả lời khác, nhưng ít nhất bạn sẽ không phải thêm cấu hình cho tất cả và mọi máy chủ mà bạn kết nối!


13
Đây là một giải pháp tuyệt vời cho câu hỏi được hỏi, nhưng không đáp ứng được nhu cầu mà người hỏi dự định. Đối với tôi, đó chính xác là giải pháp phù hợp và nó đáp ứng hoàn hảo nhu cầu "Cách tốt nhất để sử dụng nhiều khóa riêng SSH trên một máy khách".
lội qua

2
Điều này dường như không hoạt động theo khai báo Máy chủ trong tệp cấu hình
Maksim Luzik

30
Điều này không hoạt động tốt với git, vì nếu bạn có hai khóa triển khai github, khóa đầu tiên trong danh sách là hợp lệ và sẽ hoạt động, nhưng sau đó github sẽ phàn nàn rằng kho lưu trữ không khớp.
Adam Reis

1
Nếu SFTP / máy chủ mục tiêu có các chính sách bảo mật khóa tài khoản (giả sử sau 3 lần thử kết nối không thành công), điều này sẽ không khóa tài khoản. Một kết nối đã được thử, nhưng với tệp 'khóa sai'
alchemist.gamma

7
Hãy nhận biết nếu bạn có một cái gì đó như fail2ban trên các máy chủ đó. Bạn có thể kết thúc ở một trong những nhà tù đó ... vì những lần thử thất bại được tạo bởi các khóa khác ...
Piccolo

254

Câu trả lời từ Randal Schwartz gần như đã giúp tôi tất cả các cách. Tôi có một tên người dùng khác trên máy chủ, vì vậy tôi phải thêm từ khóa Người dùng vào tệp của mình:

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

Bây giờ bạn có thể kết nối bằng tên thân thiện:

ssh friendly-name

Nhiều từ khóa có thể được tìm thấy trên trang người dùng OpenSSH . LƯU Ý: Một số từ khóa được liệt kê có thể đã có trong tệp / etc / ssh / ssh_config của bạn .


Nếu tôi không nhầm người dùng, bạn thường chỉ định trực tiếp trong url khi kết nối với người dùng @ host
a1an

3
Tôi cũng thích sử dụng từ khóa 'Cổng'. Một từ khóa thú vị khác là 'StricthostKeyChecking'.
Ethan

122

Các câu trả lời trước đã giải thích chính xác cách tạo tệp cấu hình để quản lý nhiều khóa ssh. Tôi nghĩ rằng, điều quan trọng cũng cần được giải thích là việc thay thế tên máy chủ bằng tên bí danh trong khi nhân bản kho lưu trữ .

Giả sử, tên người dùng tài khoản GitHub của công ty bạn là abc1234 . Và giả sử tên người dùng của tài khoản GitHub cá nhân của bạn là jack1234

Và, giả sử bạn đã tạo hai khóa RSA, cụ thể là id_rsa_companyid_rsa_personal . Vì vậy, tập tin cấu hình của bạn sẽ trông như dưới đây:

# 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

Bây giờ, khi bạn đang nhân bản kho lưu trữ (có tên là bản demo) từ tài khoản GitHub của công ty, URL của kho lưu trữ sẽ có dạng như sau:

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

Bây giờ, trong khi thực hiện git clone, bạn nên sửa đổi URL kho lưu trữ ở trên là:

git@company:abc1234/demo.git

Lưu ý cách github.com hiện được thay thế bằng "công ty" bí danh như chúng tôi đã xác định trong tệp cấu hình.

Similary, bạn phải sửa đổi URL bản sao của kho lưu trữ trong tài khoản cá nhân tùy thuộc vào bí danh được cung cấp trong tệp cấu hình.


10
Tôi ước tôi có thể nâng cao câu trả lời này hơn một lần ... đây là cách chính xác để tiếp cận vấn đề, và nó an toàn và nhanh hơn các lựa chọn khác.
Khả

4
Lãng phí không còn thời gian, đây là câu trả lời. Cảm ơn nhiều.
Luis Milanese

2
Tôi thực sự muốn tôi tìm thấy câu trả lời này sớm hơn ... nhưng muộn còn hơn không, Cảm ơn nhiều!
Hildy

2
Giải thích tuyệt vời! Hoạt động hoàn hảo cho tôi. Và nếu bạn quên sao chép repo với bí danh, bạn có thể thường xuyên chỉnh sửa url gốc từ xa.
tkahn

1
chỉ thanh toán attencion vì tệp cấu hình phải là (chmod 600)
Christiano Matos

105
ssh-add ~/.ssh/xxx_id_rsa

Hãy chắc chắn rằng bạn đã kiểm tra nó trước khi thêm bằng:

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

Nếu bạn có bất kỳ vấn đề nào với lỗi đôi khi việc thay đổi bảo mật của tệp sẽ giúp:

chmod 0600 ~/.ssh/xxx_id_rsa

4
Đây là giải pháp ngắn gọn và thanh lịch nhất theo ý kiến ​​của tôi. Làm việc như người ở!
artur

@Bobo bạn có thể đặt nó trong bashrc hoặc bash_profile của bạn (hoặc bất cứ điều gì tương đương với mac) không?
T0xicCode

6
+1 cho chmod 0600 - các vấn đề về quyền đã ngăn tôi kết nối
amacy

Làm việc như một cơ duyên đối với tôi (và đừng quên khoảng 0600 perm).
Dmytro Uhnichenko

1
Đã đến từ Ubuntu trên mac và đây chính xác là những gì tôi cần.
hariom

42
  1. Tạo khóa SSH:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. Tạo khóa SSH khác :

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

    Bây giờ, hai khóa công khai ( id_rsa.pub , accountB.pub ) nên tồn tại trong ~/.ssh/thư mục.

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory
    
  3. Tạo tập tin cấu hình ~/.ssh/configvới các nội dung sau:

    $ 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. Bản sao từ defaulttài khoản.

    $ git clone git@bitbucket.org:username/project.git
    
  5. Bản sao từ accountB tài khoản.

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

Xem thêm tại đây


24

Tôi đồng ý với Tuomas về việc sử dụng ssh-agent. Tôi cũng muốn thêm khóa riêng thứ hai cho công việc và hướng dẫn này hoạt động như một cơ duyên đối với tôi.

Các bước như sau:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key ví dụ ssh-add ~/.ssh/id_rsa
  3. Xác minh bằng $ ssh-add -l
  4. Kiểm tra nó với $ssh -v <host url>ví dụssh -v git@assembla.com

4
Đã sử dụng ssh-agenttrong nhiều năm, gần đây tôi đã chuyển sang sử dụng Gnome gnome-keyringtrong i3wm của mình . Lý do rất đơn giản: Trình quản lý khóa của Gnome tự động xử lý thêm và xóa các khóa ssh mà tôi không phải nhớ ssh-add. Ngoài việc cung cấp cho tôi một mật khẩu duy nhất để mở khóa chúng (và hết thời gian vào một thời gian nhất định, để bảo mật). Để mỗi mình. Vì tôi sử dụng cài đặt gnome trên Arch, nên nó đã được cài đặt với thiết lập của tôi. Nếu bạn là người chống gnome, hãy bỏ qua bình luận này.
eduncan911

@ eduncan911, tôi đồng ý rằng gnome-keyring có thể hữu ích, nhưng nó không thực sự xử lý các khóa ed25519, vì vậy đối với tôi là người không bắt đầu. Cập nhật: Tôi thấy từ wiki.archlinux.org/index.php/GNOME/ , hiện tại nó sử dụng tác nhân ssh của hệ thống để điều đó không còn là vấn đề nữa.
Brian Minton

15

Tôi đã gặp phải vấn đề này một thời gian trước, khi tôi có hai tài khoản Bitbucket và muốn lưu trữ các khóa SSH riêng cho cả hai. Đây là những gì làm việc cho tôi.

Tôi đã tạo hai cấu hình ssh riêng biệt như sau.

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

Bây giờ khi tôi phải sao chép một kho lưu trữ từ tài khoản công việc của mình - lệnh như sau.

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

Tôi đã phải sửa đổi lệnh này thành:

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

Tương tự, lệnh sao chép từ tài khoản cá nhân của tôi phải được sửa đổi thành

git clone git @ Personal .bitbucket.org: tên / Personalproject.git

Tham khảo liên kết này để biết thêm thông tin.



11

Bây giờ, với phiên bản Git gần đây, chúng ta có thể chỉ định sshCommand trong tệp cấu hình Git dành riêng cho kho lưu trữ:

  [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

Bạn có thể tạo một tập tin cấu hình có tên configtrong ~/.sshthư mục của bạn . Nó có thể chứa:

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

Điều này sẽ cho phép bạn kết nối với các máy như thế này

 ssh aws

IdFile có hình thức nào? Một con đường tuyệt đối. Bạn có thể cung cấp một ví dụ
Peter Mortensen

1

Trên Ubuntu 18.04 không có gì để làm.

Sau khi tạo khóa ssh thứ 2, hệ thống sẽ cố gắng tìm khóa ssh phù hợp cho mỗi kết nối.

Để rõ ràng, bạn có thể tạo một khóa mới với các lệnh này

# 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

Nhiều cặp khóa trong GITHUB

FILE CONFIG 1.0

1.1 TẠO ~ / .ssh / config

1,2 chmod 600 ~ / .ssh / config (PHẢI)

1.3 đầu vào sau vào tệp:

Chủ nhà pizza

Tên máy chủ github.com

PrekeyredAuthentifying publickey # tùy chọn

Danh tínhFile ~ / .ssh / privatekey1

Trường hợp A: ĐÁNH GIÁ GIT MỚI

sử dụng lệnh này để git clone:

$ git clone git @ pizza: yourgitusername / pizzahut numpo.git

Lưu ý: Nếu bạn muốn thay đổi tên Máy chủ lưu trữ pizza pizza của .ssh / config trong tương lai, hãy vào thư mục nhân bản git, chỉnh sửa dòng url tệp .git / config (xem Trường hợp B)

Trường hợp B: CRENG CÓ GỌI ĐIỆN THOẠI GIT

2.1 vào thư mục nhân bản, sau đó vào thư mục .git

Chỉnh sửa tập tin cấu hình 2.2

2.3 cập nhật url từ Cũ sang Mới:

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

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


1

đối với tôi giải pháp làm việc duy nhất là chỉ cần thêm vào ~/.ssh/config

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

your_ssh_key không có bất kỳ phần mở rộng nào, không sử dụng .pub


1

QUAN TRỌNG: Bạn phải bắt đầu ssh-agent

Bạn phải khởi động ssh-agent (nếu nó chưa chạy) trước khi sử dụng ssh-add như sau:

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

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

Lưu ý rằng lệnh eval khởi động tác nhân trên Git Bash trên Windows. Các môi trường khác có thể sử dụng một biến thể để khởi động tác nhân SSH.


0

Như đã đề cập trên trang blog atlassian tạo một cấu hình trong .ssh bao gồm văn bản sau:

#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

Sau đó, bạn có thể chỉ cần kiểm tra với tên miền hậu tố và trong các dự án bạn có thể định cấu hình tên Tác giả, v.v.


0

Bạn có thể thử gói sshmulti npm này để duy trì nhiều khóa ssh.


Tôi thực sự khuyên bạn không nên sử dụng npm cho bất cứ điều gì như thế này. Nó có một loạt các phụ thuộc, trong đó, kiểm tra ngắn gọn, bao gồm một loạt các nhà phát triển sói đơn độc, các gói cũ vài năm. Trang sshmulti npm tự tuyên bố rằng nó chưa được kiểm tra.
Jack Wasey

0

Đây là giải pháp mà tôi đã sử dụng lấy cảm hứng từ câu trả lời của @ sajib-khan. Cấu hình mặc định không được đặt, đó là tài khoản cá nhân của tôi trên gitlab và cái được chỉ định khác là tài khoản công ty của tôi. Đây là những gì tôi đã làm:

Tạo khóa ssh

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

Chỉnh sửa cấu hình ssh

nano ~/.ssh/config

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

Xóa (các) khóa ssh được lưu trữ

ssh-add -D

Kiểm tra nó!

ssh -T git@company.gitlab.com

Chào mừng bạn đến với GitLab, @ hugo.sohm!

ssh -T git@gitlab.com

Chào mừng bạn đến với GitLab, @HugoSohm!

Sử dụng nó !

Tài khoản công ty

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

Tài khoản cá nhân / mặc định

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

Đây là nguồn mà tôi đã sử dụng, hy vọng nó sẽ giúp!


0

Tôi thích cách tiếp cận để đặt các mục sau trong ~ / .ssh / config:

# Config 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 repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

Sau đó, trong repo của bạn, bạn có thể tạo một .envtệp chứa lệnh ssh sẽ được sử dụng:

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

Nếu sau đó bạn sử dụng, ví dụ dotenv , var môi trường được xuất tự động và whoop, bạn có thể chỉ định khóa bạn muốn cho mỗi dự án / thư mục. Mật khẩu chỉ được yêu cầu một lần kể từ khi được thêm vào móc khóa.

Giải pháp này hoạt động hoàn hảo với git và được thiết kế để hoạt động trên máy Mac (do UseKeychain).


0

Trên CentOS 6.5 chạy OpenSSH_5.3p1 và OpenSSL 1.0.1e-fips, tôi đã giải quyết vấn đề bằng cách đổi tên các tệp chính của mình để không ai trong số chúng có tên mặc định.

Thư mục .ssh của tôi chứa id_rsa_foo và id_rsa_bar, nhưng không có id_rsa, v.v.


Và làm thế nào để các phím được sử dụng? Có tự động phát hiện?
robsch

Xem câu trả lời Randal Schwartz cho một cách để chọn khóa chính xác cho một loạt đưa stackoverflow.com/questions/2419566/...
Chris Owens

Vâng, điều đó làm cho nó rõ ràng hơn. Ngay cả việc sử dụng -itùy chọn có thể dẫn đến một cái gì đó như no such identity: /home/embo/.ssh/id_rsa: No such file or directory.
Peter Mortensen
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.