Bagaimana cara menggunakan Keychain Mac OS X dengan kunci SSH?

141

Saya mengerti bahwa sejak Mac OS X Leopard Keychain telah mendukung penyimpanan kunci SSH. Bisakah seseorang tolong jelaskan bagaimana fitur ini seharusnya berfungsi.

Saya memiliki beberapa kunci RSA yang saya hasilkan disimpan di direktori ~ / .ssh saya untuk mengakses berbagai server. Saya tidak memiliki kata sandi yang ditetapkan pada kunci-kunci itu. Saat ini untuk masuk ke server-server itu saya menggunakan perintah-perintah berikut di Terminal:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh user @ server

(Saya telah menulis beberapa fungsi Bash untuk membuatnya lebih mudah.)

Apakah ada cara yang lebih baik untuk melakukan ini menggunakan Keychain?

John Topley
sumber

Jawaban:

16

Agar berfungsi, $SSH_AUTH_SOCKvariabel lingkungan harus diarahkan /tmp/launch-xxxxxx/Listeners. Ini seharusnya dilakukan secara otomatis ketika Anda masuk. Pendengar pada soket itu berbicara protokol ssh-agent.

Skrip bash Anda memulai agen ssh Anda sendiri (dieja ssh-agent, bukan ssh_agent) dan mengganti yang sudah ada ssh-agentyang diatur untuk Anda saat login.

Juga, inti dari gantungan kunci adalah untuk menyimpan kata sandi ke kunci ssh Anda, tetapi Anda mengatakan bahwa Anda tidak memiliki kata sandi yang ditetapkan pada kunci-kunci itu, jadi saya tidak yakin apa yang Anda harapkan dari integrasi gantungan kunci.

Terakhir, ketika Anda masuk pertama kali, Anda mungkin tidak akan melihat proses ssh-agent. Proses itu akan dimulai secara otomatis dengan meluncurkan layanan saat pertama kali sesuatu mencoba membaca soket itu /tmp.

Rudedog
sumber
1
Terima kasih. Jadi saya masih harus menjalankan ssh-adduntuk menambahkan identitas RSA saya ke agen ssh default mulai saat masuk?
John Topley
Anda tidak harus menjalankan ssh-add; ssh-agent akan meminta frasa sandi kunci saat pertama kali Anda menjalankan ssh.
Rudedog
3
Ini meminta saya untuk kata sandi setiap kali saya menjalankan ssh. Intinya saya tidak mau harus memasukkan kata sandi apa pun.
John Topley
1
Apa yang meminta kata sandi Anda? Saya mulai curiga bahwa itu adalah server jauh yang mendorong Anda, yang membuat pernyataan Anda bahwa kunci Anda tidak memiliki frasa sandi dalam perspektif yang lebih baik. Jika Anda ingin mem-bypass kata sandi di server jarak jauh, Anda perlu menambahkan kunci publik Anda $HOME/.ssh/authorized_keysdi server itu. Agen-ssh + keychain Mac OS hanya digunakan untuk menyimpan frasa sandi untuk kunci ssh lokal Anda; itu tidak dimaksudkan untuk mengirim kata sandi jarak jauh melalui koneksi ssh yang ada.
Rudedog
1
gunakan ssh -vuntuk mendiagnosis apa yang ssh lakukan. juga digunakan sshd -p 8900 -vdi sisi server dan ssh -v remote:8900untuk mendiagnosis apa yang dilakukan sshd.
Rudedog
252

Pada rilis Leopard OS X, ssh-agent lebih terintegrasi dengan Keychain. Dimungkinkan untuk menyimpan frasa sandi semua kunci SSH Anda dengan aman di Gantungan Kunci, dari mana ssh-agent akan membacanya saat startup. Intinya adalah mudah untuk mengamankan kunci Anda dengan frasa sandi, tetapi tidak perlu mengetikkan frasa sandi untuk menggunakannya! Begini caranya:

Tambahkan frasa sandi ke setiap kunci ssh ke gantungan kunci: (opsi -k memuat hanya kunci privat, melompati sertifikat)

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

(perhatikan itu huruf kapital K)

Setiap kali Anda menyalakan ulang Mac, semua kunci SSH di gantungan kunci Anda akan secara otomatis dimuat. Anda harus dapat melihat kunci di aplikasi Keychain Access, dan juga dari baris perintah melalui:

ssh-add -l
jeffmcc
sumber
ssh-add -ltidak mencantumkan kunci apa pun saat menghubungkan dari jarak jauh (di mana $ DISPLAY tidak disetel). Trik khusus perlu digunakan di sini untuk menggunakan gantungan kunci (mis. Di superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… Anda juga memerlukan opsi -K untuk menyimpan frasa sandi di gantungan kunci.
Neeme Praks
5
Jika Anda menginstal versi SSH lain melalui sistem paket seperti Homebrew, maka perlu menggunakan path absolut seperti /usr/bin/ssh-add.
Ludovic Kuty
1
Menariknya di macOS Sierra saya tidak meminta kata sandi setelah reboot tetapi ssh-add -lmengembalikan "Agen tidak memiliki identitas." ( ps auxtermasuk /usr/bin/ssh-agent -l).
Halil Özgür
4
Untuk macOS Sierra, banyak hal telah berubah. Lihat github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
80

Pada macOS Sierra , ssh-agent tidak lagi memuat secara otomatis kunci ssh yang dimuat sebelumnya ketika Anda masuk ke akun Anda. Ini disengaja pada bagian Apple, mereka ingin menyelaraskan kembali dengan implementasi OpenSSH utama . [1]


Seperti yang dijelaskan di sini , ini adalah metode yang disarankan sejak macOS 10.12.2 :

  1. Tambahkan baris berikut ke ~/.ssh/configfile Anda :

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Kunci apa pun yang Anda tambahkan ke ssh-agent menggunakan ssh-add /path/to/your/private/key/id_rsaperintah akan secara otomatis ditambahkan ke gantungan kunci, dan harus dimuat secara otomatis saat reboot.


Berikut ini sudah usang (disimpan untuk referensi).

Untuk kembali ke perilaku sebelumnya, Anda ingin menjalankan ssh-add -Aperintah (yang secara otomatis memuat semua kunci ssh yang memiliki pass-phrase pada gantungan kunci Anda) ketika Anda masuk. Untuk melakukannya, ikuti langkah-langkah ini:

  1. Pertama, tambahkan semua kunci yang ingin Anda muat otomatis ke ssh-agent menggunakan ssh-add -K /absolute/path/to/your/private/key/id_rsaperintah. The -Kargumen memastikan bahwa kunci pass-frase ditambahkan ke keychain MacOS ini . Pastikan Anda menggunakan jalur absolut ke tombol. Menggunakan jalur relatif akan membuat skrip yang diluncurkan secara otomatis tidak menemukan kunci Anda.

  2. Pastikan semua kunci Anda ditampilkan seperti yang ditambahkan saat Anda mengetik ssh-add -A.

  3. Buat file bernama com.yourusername.ssh-add.plistdalam ~/Library/LaunchAgents/dengan isi di bawah ini. File plist seperti ini digunakan launchduntuk menjalankan skrip saat Anda masuk. [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. Katakan launchduntuk memuat berkas plist yang baru saja dibuat dengan mengeksekusi: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

Dan Anda harus siap.

Ricardo Sanchez-Saez
sumber
33

Ada cara yang lebih sederhana daripada jawaban Ricardo untuk tetap menggunakan kata sandi di antara sesi / restart Mac Anda yang menjalankan 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Catatan: ubah jalur ke tempat kunci id_rsa Anda berada.
  2. ssh-add -A
  3. Buat (atau edit jika ada) ~/.ssh/configfile berikut :

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

    Sekarang kata sandi diingat antara restart!

Apple dengan sengaja mengubah perilaku ssh-agent di macOS 10.12 Sierra untuk tidak lagi memuat kunci SSH sebelumnya secara otomatis, seperti yang tercantum dalam OpenRadar , diskusi Twitter , dan Catatan Teknis dari Apple ini . Solusi di atas akan meniru perilaku lama El Capitan dan mengingat kata sandi Anda.

ChrisJF
sumber
2
Luar biasa, bekerja seperti pesona, lebih bersih daripada yang lain dan diselesaikan di tempat yang tepat :)
GerardJP
10

Catatan: untuk macOS Sierra, silakan merujuk ke jawaban yang lebih baru oleh ChrisJF .

[Jawaban oleh Jeff McCarrell] [2] benar, kecuali bahwa perintah untuk menambahkan frasa sandi berisi en dasbor alih-alih tanda hubung, yaitu –Kalih-alih -K, menyebabkan pesan pada efek dari –K: No such file or directory. Itu harus membaca:

ssh-add -K [path/to/private SSH key]
simonair
sumber
2
Ini harus menjadi komentar untuk jawaban yang Anda rujuk alih-alih jawaban baru. Kita berbicara tentang keamanan di sini. Seseorang dapat menyarankan Anda harus mengetiknya dengan hati-hati daripada menyalin dan menempel secara membabi butassh-add -K
Phil_1984_
1
Menggunakan tanda hubung dengan K, saya mengerti illegal option -- K. Huruf kecil k terdaftar sebagai opsi.
Sam Dutton
Terima kasih untuk umpan baliknya. Saya baru saja memeriksa macOS Sierra:, -Kyaitu dash-capital-K, masih berlaku
simonair
6

Saya menduga Anda tidak menggunakan sshperintah default . Apakah Anda telah sshmenginstal melalui port? Cobalah which sshuntuk melihat sshperintah mana yang Anda gunakan.

Biasanya ia akan menampilkan kotak dialog yang menanyakan kata sandi Anda, jika belum tersimpan di gantungan kunci Anda.

Olly
sumber
Saya tidak menggunakan porta.
John Topley
Terima kasih atas informasinya :) Saya punya masalah karena saya menggunakan OpenSSH dari Homebrew.
ggustafsson
6

Saya memiliki masalah yang sama ketika mencoba masuk menggunakan ssh cert klien. Dalam kasus khusus ini untuk mengakses repositori git. Inilah situasinya:

  • Kunci telah disimpan di ~/.ssh/
  • Kunci pribadi memiliki frasa sandi.
  • Frasa sandi disimpan dalam keychain login OS X. ~/Library/Keychains/login.keychain
  • Koneksi adalah sebagai berikut: ->server mac remote saya ->git / ssh
  • Mac OS X 10.8.5

Ketika saya terhubung ke remote mac menggunakan remote desktop, saya tidak punya masalah. Namun ketika terhubung dengan SSH ke mac jarak jauh, saya diminta frasa sandi ssh setiap kali. Langkah-langkah berikut ini memecahkannya untuk saya.

  1. security unlock-keychainFrasa sandi disimpan dalam gantungan kunci masuk. Ini membuka kunci dan memungkinkan ssh-agent untuk mengaksesnya.
  2. eval `ssh-agent -s`Mulai ssh-agent untuk penggunaan shell. Ini akan mendapatkan frasa sandi dari gantungan kunci dan menggunakannya untuk membuka kunci ssh pribadi.
  3. Buat koneksi ssh / git dan lakukan pekerjaan saya.
  4. eval `ssh-agent -k` Bunuh ssh-agent yang sedang berjalan.
  5. security lock-keychain Kunci lagi gantungan kunci.
orkoden
sumber
1
Agar # 2 berfungsi untuk saya dalam alias, saya harus menggunakan eval \$(ssh-agent)per Re: remote login dan gantungan kunci . Ketika tidak ada dalam alias eval $(ssh-agent)berfungsi ( tanpa backslash $ ).
Travis
4

Lihat juga:

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

... menambahkan catatan ini ketika diminta lebih detail: perintah "keamanan" mampu mengimpor kunci (dan hal-hal lain) langsung ke Gantungan Kunci. Yang menyenangkan adalah bahwa tidak seperti ssh-add, Anda dapat menentukan gantungan kunci. Ini memungkinkan untuk mengimpor langsung ke sistem Keychain ("keamanan manusia" untuk mempelajari caranya)

xaphod
sumber
1
Bisakah Anda memberikan sedikit lebih detail untuk jawaban ini? Terima kasih.
Matthew Williams
1

Solusi terbaik dan yang dimaksudkan Apple (sejak macOS 10.12.2) dijelaskan di sini

Jadi lakukan saja hal berikut:

echo "UseKeychain yes" >> ~ / .ssh / config

Ben
sumber
1
Penggunaan >>beresiko jika Anda memasukkan perintah beberapa kali. Lebih baik lakukan edisi manual file, seperti yang dijelaskan oleh jawaban ChrisJF .
Cœur
Ya Anda di sana
Ben