Làm cách nào để sử dụng Mac OS X Keychain với các khóa SSH?


141

Tôi hiểu rằng vì Mac OS X Leopard, Keychain đã hỗ trợ lưu trữ các khóa SSH. Ai đó có thể vui lòng giải thích làm thế nào tính năng này được cho là hoạt động.

Tôi có một số khóa RSA mà tôi đã tạo được lưu trữ trong thư mục ~ / .ssh của mình để truy cập các máy chủ khác nhau. Tôi không có cụm mật khẩu được đặt trên các phím đó. Hiện tại để đăng nhập vào các máy chủ đó, tôi sử dụng các lệnh sau trong Terminal:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
người dùng ssh @ máy chủ

(Tôi đã viết một số hàm Bash để làm điều này dễ dàng hơn.)

Có cách nào tốt hơn để làm điều này bằng cách sử dụng Keychain không?

Câu trả lời:


16

Để nó hoạt động, $SSH_AUTH_SOCKbiến môi trường nên được trỏ đến /tmp/launch-xxxxxx/Listeners. Điều này được cho là được thực hiện tự động khi bạn đăng nhập. Người nghe trên ổ cắm đó nói giao thức ssh-agent.

Các tập lệnh bash của bạn đang bắt đầu tác nhân ssh của riêng bạn (đánh vần ssh-agent, không phải ssh_agent) và ghi đè lên phần hiện ssh-agentcó được thiết lập cho bạn khi đăng nhập.

Ngoài ra, toàn bộ quan điểm của móc khóa là lưu trữ mật khẩu vào các khóa ssh của bạn, nhưng bạn nói rằng bạn không có cụm mật khẩu được đặt trên các khóa đó, vì vậy tôi không chắc bạn đang mong đợi gì về tích hợp móc khóa.

Cuối cùng, khi bạn đăng nhập lần đầu, có lẽ bạn sẽ không thấy quy trình ssh-agent. Quá trình đó sẽ được bắt đầu tự động bằng cách khởi chạy dịch vụ vào lần đầu tiên một cái gì đó cố gắng đọc ổ cắm đó /tmp.


1
Cảm ơn. Vì vậy, tôi vẫn sẽ phải chạy ssh-addđể thêm danh tính RSA của mình vào tác nhân ssh mặc định bắt đầu khi đăng nhập?
John Topley

Bạn không phải chạy ssh-add; ssh-agent sẽ yêu cầu mật khẩu của khóa trong lần đầu tiên bạn chạy ssh.
Rudedog

3
Nó nhắc tôi nhập mật khẩu mỗi khi tôi chạy ssh. Vấn đề là tôi không muốn phải nhập bất kỳ mật khẩu nào.
John Topley

1
Điều gì đang nhắc bạn cho mật khẩu? Tôi bắt đầu nghi ngờ rằng đó là máy chủ từ xa đang nhắc nhở bạn, điều này đưa ra tuyên bố của bạn rằng các khóa của bạn không có cụm mật khẩu trong phối cảnh tốt hơn. Nếu bạn muốn bỏ qua mật khẩu trên máy chủ từ xa, bạn cần thêm khóa công khai của mình $HOME/.ssh/authorized_keysvào máy chủ đó. Ssh-agent + móc khóa của Mac OS chỉ được sử dụng để lưu trữ cụm mật khẩu cho các khóa ssh cục bộ của bạn; nó không có nghĩa là gửi mật khẩu từ xa qua các kết nối ssh hiện có.
Rudedog

1
sử dụng ssh -vđể chẩn đoán những gì ssh đang làm. cũng sử dụng sshd -p 8900 -vở phía máy chủ và ssh -v remote:8900để chẩn đoán sshd đang làm gì.
Rudedog

252

Kể từ phiên bản Leopard của OS X, ssh-agent được tích hợp chặt chẽ hơn với Keychain. Có thể lưu trữ các cụm mật khẩu của tất cả các khóa SSH của bạn một cách an toàn trong Keychain, từ đó ssh-agent sẽ đọc chúng khi khởi động. Điểm mấu chốt là rất đơn giản để bảo mật các khóa của bạn bằng cụm mật khẩu, nhưng không bao giờ phải nhập cụm mật khẩu để sử dụng chúng! Đây là cách thực hiện:

Thêm cụm từ vào mỗi khóa ssh vào móc khóa: (tùy chọn -k chỉ tải các khóa riêng đơn giản, bỏ qua chứng chỉ)

ssh-add -K [path/to/private SSH key]

(lưu ý đó là vốn K)

Bất cứ khi nào bạn khởi động lại máy Mac, tất cả các khóa SSH trong móc khóa của bạn sẽ được tự động tải. Bạn sẽ có thể thấy các phím trong ứng dụng Keychain Access, cũng như từ dòng lệnh thông qua:

ssh-add -l

ssh-add -lkhông liệt kê bất kỳ khóa nào khi kết nối từ xa (trong đó $ HIỂN THỊ không được đặt). Các thủ thuật đặc biệt cần được sử dụng ở đây để sử dụng móc khóa (ví dụ: trong superuser.com/questions/141044/ mẹo )
Ether

2
developer.apple.com/l Library / mac / documentation / Darwin / Reference / Lỗi Bạn cũng cần tùy chọn -K để lưu trữ cụm mật khẩu trong móc khóa.
Neeme Praks

5
Nếu bạn đã cài đặt một phiên bản SSH khác thông qua một hệ thống gói như Homebrew, thì cần phải sử dụng một đường dẫn tuyệt đối như thế nào /usr/bin/ssh-add.
Ludovic Kuty

1
Điều thú vị là trong macOS Sierra của tôi, nó không yêu cầu mật khẩu sau khi khởi động lại mà ssh-add -ltrả về "Tác nhân không có danh tính." ( ps auxbao gồm /usr/bin/ssh-agent -l).
Halil Özgür

4
Đối với macOS Sierra, mọi thứ đã thay đổi. Xem github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel

80

Kể từ macOS Sierra , ssh-agent không còn tự động tải các khóa ssh đã tải trước đó khi bạn đăng nhập vào tài khoản của mình. Đây là chủ ý từ phía Apple, họ muốn liên kết lại với việc triển khai OpenSSH chính thống . [1]


Như đã giải thích ở đây , đây là phương pháp được đề xuất kể từ macOS 10.12.2 :

  1. Thêm các dòng sau vào ~/.ssh/configtập tin của bạn :

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Bất kỳ khóa nào bạn thêm vào ssh-agent bằng ssh-add /path/to/your/private/key/id_rsalệnh sẽ được tự động thêm vào móc khóa và sẽ được tự động tải khi khởi động lại.


Sau đây là không dùng nữa (giữ để tham khảo).

Để quay lại hành vi trước đó, bạn muốn chạy ssh-add -Alệnh (tự động tải tất cả các khóa ssh có cụm từ trên móc khóa của bạn) khi bạn đăng nhập. Để làm điều đó, hãy làm theo các bước sau:

  1. Đầu tiên, thêm tất cả các khóa bạn muốn tự động tải vào tác nhân ssh bằng cách sử dụng ssh-add -K /absolute/path/to/your/private/key/id_rsalệnh. Đối -Ksố đảm bảo rằng cụm mật khẩu chính được thêm vào móc khóa của macOS . Hãy chắc chắn rằng bạn sử dụng đường dẫn tuyệt đối đến phím. Sử dụng một đường dẫn tương đối sẽ làm cho tập lệnh tự động khởi chạy không tìm thấy khóa của bạn.

  2. Đảm bảo rằng tất cả các phím của bạn được hiển thị như được thêm khi bạn nhập ssh-add -A.

  3. Tạo một tập tin gọi com.yourusername.ssh-add.plisttrong ~/Library/LaunchAgents/với những nội dung dưới đây. Các tệp Plist như tệp này được sử dụng launchdđể chạy tập lệnh khi bạn đăng nhập. [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Yêu cầu launchdtải tập tin plist bạn vừa tạo bằng cách thực hiện : launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

Và bạn nên được thiết lập tất cả.



33

Có một cách đơn giản hơn câu trả lời của Ricardo để duy trì mật khẩu giữa các phiên / khởi động lại máy Mac của bạn chạy 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Lưu ý: thay đổi đường dẫn đến vị trí khóa id_rsa của bạn.
  2. ssh-add -A
  3. Tạo (hoặc chỉnh sửa nếu nó tồn tại) ~/.ssh/configtệp sau :

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    Bây giờ mật khẩu được ghi nhớ giữa khởi động lại!

Apple cố tình thay đổi hành vi của ssh-agent trong macOS 10.12 Sierra để không còn tự động tải các khóa SSH trước đó, như đã lưu ý trong OpenRadar này , thảo luận TwitterGhi chú kỹ thuật từ Apple . Giải pháp trên sẽ bắt chước hành vi cũ của El Capitan và ghi nhớ mật khẩu của bạn.


2
Tuyệt vời, hoạt động như một bùa mê, imho sạch sẽ hơn rất nhiều so với những người khác và giải quyết đúng chỗ :)
GerardJP


10

Lưu ý: đối với macOS Sierra, vui lòng tham khảo câu trả lời gần đây hơn của ChrisJF .

[Câu trả lời của Jeff McCarrell] [2] là chính xác, ngoại trừ lệnh thêm cụm từ có chứa dấu gạch ngang thay vì dấu gạch nối, tức là –Kthay vì -K, gây ra thông báo có hiệu lực –K: No such file or directory. Nó nên đọc:

ssh-add -K [path/to/private SSH key]

2
Đây phải là một nhận xét cho câu trả lời bạn đề cập hơn là một câu trả lời mới. Chúng ta đang nói về an ninh ở đây. Người ta có thể đề nghị bạn nên cẩn thận gõ nó ra thay vì sao chép và dán một cách mù quángssh-add -K
Phil_1984_

1
Sử dụng dấu gạch nối với K, tôi nhận được illegal option -- K. Chữ thường k được liệt kê như một tùy chọn.
Sam Dutton

Cảm ơn vì bạn đã phản hồi. Tôi vừa kiểm tra trên macOS Sierra : -K, ví dụ: dash-capital-K, vẫn còn hiệu lực
simonair

6

Tôi nghi ngờ bạn không sử dụng sshlệnh mặc định . Bạn đã sshcài đặt qua cổng chưa? Hãy thử which sshxem sshbạn đang sử dụng lệnh nào.

Thông thường nó sẽ hiển thị một hộp thoại hỏi mật khẩu của bạn, nếu nó chưa được lưu trong móc khóa của bạn.


Tôi không sử dụng cổng.
John Topley

Cảm ơn thông tin :) Tôi gặp vấn đề vì tôi đang sử dụng OpenSSH từ Homebrew.
ggustafsson

6

Tôi đã gặp một vấn đề tương tự trong khi cố gắng đăng nhập bằng chứng nhận ssh của khách hàng. Trong trường hợp cụ thể này, nó là để truy cập vào một kho lưu trữ git. Đây là tình huống:

  • Khóa đã được lưu trong ~/.ssh/
  • Khóa riêng có cụm mật khẩu.
  • Cụm mật khẩu được lưu trong móc khóa đăng nhập OS X. ~/Library/Keychains/login.keychain
  • Kết nối như sau: máy chủ ->mac ->git / ssh mac của tôi
  • Mac OS X 10.8.5

Khi tôi kết nối với máy Mac từ xa bằng máy tính để bàn từ xa, tôi không gặp vấn đề gì. Tuy nhiên, khi kết nối với SSH với mac từ xa, tôi luôn được hỏi cụm mật khẩu ssh. Các bước sau đây đã giải quyết nó cho tôi.

  1. security unlock-keychainCụm mật khẩu được lưu trong móc khóa đăng nhập. Điều này mở khóa và cho phép ssh-agent truy cập nó.
  2. eval `ssh-agent -s`Bắt đầu ssh-agent để sử dụng shell. Nó sẽ lấy cụm mật khẩu từ móc khóa và sử dụng nó để mở khóa khóa ssh riêng.
  3. Thiết lập kết nối ssh / git và thực hiện công việc của tôi.
  4. eval `ssh-agent -k` Giết các ssh-agent đang chạy.
  5. security lock-keychain Khóa móc khóa lại.

1
Để # 2 hoạt động với tôi trong một bí danh, tôi đã phải sử dụng eval \$(ssh-agent)cho mỗi Re: đăng nhập từ xa và móc khóa . Khi không nằm trong bí danh eval $(ssh-agent)hoạt động ( không có dấu gạch chéo ngược $ ).
Travis

4

Xem thêm:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... thêm ghi chú này khi được yêu cầu chi tiết hơn: lệnh "bảo mật" có khả năng nhập khóa (và những thứ khác) trực tiếp vào Keychains. Điều thú vị là không giống như ssh-add, bạn có thể chỉ định móc khóa. Điều này cho phép nhập trực tiếp vào Keychain hệ thống ("bảo mật con người" để tìm hiểu cách thức)


1
Bạn có thể cho biết thêm một chút chi tiết cho câu trả lời này không? Cảm ơn.
Matthew Williams

1

Giải pháp tốt nhất và dự định của Apple (kể từ macOS 10.12.2) được mô tả ở đây

Vì vậy, chỉ cần làm như sau:

tiếng vang "UseKeychain có" >> ~ / .ssh / config


1
Sử dụng >>có nguy cơ nếu bạn nhập lệnh nhiều lần. Tốt hơn nên làm một phiên bản thủ công của tập tin, như được mô tả bởi câu trả lời của ChrisJF .
Cœur

Có bạn ngay tại đó
Ben
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.