macOS Sierra tampaknya tidak mengingat kunci SSH di antara reboot

185

Saya harus menjalankan perintah ini sejak memutakhirkan ke macOS:

ssh-add -K

Mengoreksi masalah setelah reboot tetapi saya harus menjalankan perintah ini setiap kali saya masuk ke komputer saya.

Jika saya tidak menjalankan perintah di atas, kunci saya ~/.sshdilewati dan saya diminta kata sandi server untuk membuat koneksi.

bisherbas
sumber
1
$ ssh-add -Kmemberi sayassh-add: illegal option -- K
modius
1
Anda harus memasukkan jalur kunci pribadi setelahnya -K. Lihat jawaban @JakeGould untuk resolusi.
bisherbas
Pembaruan 10.12.2 menghilangkan beberapa permintaan kata sandi server yang tidak perlu bagi saya. Anda sekarang tidak perlu lagi menjalankan ssh-add -K.
Wayfaring Stranger

Jawaban:

216

Pada macOS Sierra 10.12.2 Apple menambahkan ssh_configopsi yang disebut UseKeychainyang memungkinkan resolusi 'tepat' untuk masalah tersebut. Tambahkan yang berikut ke ~/.ssh/configfile Anda :

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Dari ssh_config manhalaman pada 10.12.2:

GunakanKeychain

Di macOS, tentukan apakah sistem harus mencari frasa sandi di gantungan kunci pengguna ketika mencoba menggunakan kunci tertentu. Ketika frasa sandi disediakan oleh pengguna, opsi ini juga menentukan apakah frasa sandi harus disimpan ke dalam gantungan kunci setelah diverifikasi menjadi benar. Argumennya harus 'ya' atau 'tidak'. Standarnya adalah 'tidak'.

mluisbrown
sumber
2
Menurut tautan ini: openradar.appspot.com/27348363 Apple telah "menyelaraskan kembali perilaku [mereka] dengan OpenSSH mainstream di area ini".
ThomasW
15
Tidak masuk akal jika Apple memodifikasi perilaku dengan cara yang akan menyebabkan masalah bagi sebagian besar pengembang (karena GitHub mendorong jika tidak ada yang lain) dan tidak mengatakan apa-apa kepada siapa pun!
mluisbrown
9
Saya pikir IdentityFile ~/.ssh/id_rsaitu berlebihan dan tidak diperlukan (ketika melihat opsi default). Saya tidak pernah mengatur opsi itu di file konfigurasi ssh saya.
therealmarv
9
@JakeGould perubahan IMO ~/.ssh/config~lebih disukai karena memecahkan masalah di sshtingkat. Tidak 100% yakin bahwa .bash_profilemod akan bekerja untuk klien GUI menggunakan ssh tanpa menggunakan shell.
mluisbrown
7
Apple menerbitkan Catatan Teknis TN2449 tentang perubahan itu.
Kentzo
107

Saya memiliki masalah ini juga ketika mencoba untuk menyebarkan beberapa kode menggunakan Capistrano . Sangat membuat frustrasi. Berikut adalah dua metode yang saya tahu untuk menangani masalah ini.

Metode 1: Tambahkan semua kunci yang dikenal ke agen SSH.

Jadi salah satu solusi yang saya temukan adalah menjalankan ssh-adddengan -Aopsi — yang menambahkan semua identitas yang dikenal ke agen SSH menggunakan frasa sandi apa pun yang disimpan dalam gantungan kunci Anda — seperti ini:

ssh-add -A

Sekarang ini berfungsi tetapi tidak akan bertahan di seluruh reboot. Jadi, jika Anda tidak ingin khawatir tentang ini lagi, buka saja ~/.bash_profilefile pengguna Anda seperti ini:

nano ~/.bash_profile

Dan tambahkan baris ini ke bawah:

ssh-add -A 2>/dev/null;

Sekarang ketika Anda membuka jendela Terminal baru, semua pasti bagus!

Metode 2: Tambahkan hanya kunci SSH yang ada di gantungan kunci ke agen.

Jadi, sementara ssh-add -Aopsi harus bekerja untuk sebagian besar kasus dasar, saya mengalami masalah baru-baru ini di mana saya memiliki 6-7 kotak Vagrant (yang menggunakan kunci / identitas SSH untuk akses) pengaturan pada mesin di atas yang lebih umum id_rsa.pubdi tempat.

Singkatnya, saya akhirnya dikunci dari server jauh karena terlalu banyak percobaan gagal berdasarkan kunci / identitas SSH karena akses server didasarkan pada kata sandi dan kunci / identitas SSH adalah kunci / identitas SSH. Jadi agen SSH mencoba semua kunci SSH saya, gagal dan saya bahkan tidak bisa masuk ke prompt kata sandi.

Masalahnya adalah bahwa ssh-add -Ahanya akan secara sewenang-wenang menambahkan setiap kunci SSH / identitas tunggal yang Anda miliki ke agen bahkan jika itu tidak perlu dilakukan; seperti dalam kasus kotak Vagrant.

Solusi saya setelah banyak pengujian adalah sebagai berikut.

Pertama, jika Anda memiliki lebih banyak kunci / identitas SSH yang ditambahkan ke agen Anda daripada yang Anda butuhkan — seperti yang diperlihatkan ssh-add -lkemudian bersihkan semuanya dari agen seperti:

ssh-add -D

Setelah itu selesai, kemudian mulai agen SSH sebagai proses latar belakang seperti:

eval "$(ssh-agent -s)"

Sekarang, ini jadi aneh dan saya tidak terlalu yakin mengapa. Dalam beberapa kasus, Anda dapat secara khusus menambahkan ~/.ssh/id_rsakunci / identitas ke agen seperti:

ssh-add ~/.ssh/id_rsa

Ketikkan frasa sandi Anda, tekan Returndan Anda harus baik-baik saja.

Tetapi dalam kasus lain hanya menjalankan ini sudah cukup untuk mendapatkan kunci / identitas ditambahkan:

ssh-add -K

Jika itu berhasil, ketikkan ssh-add -ldan Anda akan melihat satu kunci SSH / identitas terdaftar.

Semuanya bagus? Sekarang buka .bash_profile:

nano ~/.bash_profile

Dan tambahkan baris ini ke bawah; komentar atau hapus -Aversi jika Anda memilikinya:

ssh-add -K 2>/dev/null;

Itu akan memungkinkan kunci / identitas SSH untuk dimuat ulang ke agen SSH pada setiap startup / reboot.

PEMBARUAN: Apple sekarang telah menambahkan UseKeychainopsi ke opsi konfigurasi SSH terbuka dan mempertimbangkan ssh-add -Asolusinya juga.

Pada macOS Sierra 10.12.2, Apple telah menambahkan UseKeychainopsi konfigurasi untuk konfigurasi SSH. Memeriksa halaman manual (via man ssh_config) menunjukkan info berikut:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

Yang bermuara pada Apple melihat solusi sebagai menambah ssh-add -AAnda .bash_profile seperti yang dijelaskan dalam tiket Radar Terbuka ini atau menambahkan UseKeychainsebagai salah satu opsi dalam per pengguna ~/.ssh/config.

JakeGould
sumber
4
@modius: jika Anda memiliki kunci yang dilindungi pw, lakukan ssh-add -K [path to key]dan masukkan pw saat diminta. Keychain akan menyimpan kata sandi dan ssh-add akan mendapatkannya dari sana setelah itu.
Timo
2
Perhatikan -A adalah untuk menambahkan identitas ke agen menggunakan frasa sandi yang disimpan dalam gantungan kunci Anda. Jika Anda juga memiliki identitas tanpa frasa sandi, Anda harus menghilangkan opsi -A untuk menambahkannya ke agen Anda.
Evan Pon
12
Untuk menambah visibilitas, Apple telah memperbarui halaman manual untuk ssh_config untuk disertakan UseKeychaindan AddKeysToAgentsecara otomatis menambahkan kunci Anda dari ssh_config Anda. Tidak diperlukan skrip shell. Lihat @mluisbrown jawaban di bawah ini untuk info terbaru untuk 10.12.2
Ryan Gibbons
1
@JakeGould saya mengerti apa yang Anda katakan, saya benar-benar menyukai apa yang mereka lakukan. Alih-alih secara otomatis menyimpan frasa sandi ke Keychain dan memuatnya saat boot, mereka memberi Anda kendali atas keamanan Anda. / shrug
Ryan Gibbons
1
@RyanGibbons FWIW, lihat saran resmi dari Apple Developer Relations dalam jawaban ini di OpenRadar: “Anda dapat memperbaikinya dengan mudah dengan menjalankan ssh-add -Askrip rc Anda jika Anda ingin kunci Anda selalu dimuat.” ¯\_(ツ)_/¯
JakeGould
16

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.


Saya menambahkan jawaban ini karena:

  • Jawaban lain memberitahu Anda untuk menambahkan IdentityFile ~/.ssh/id_rsabaris, tetapi opsi itu tidak diperlukan untuk autoloading kunci (dan itu benar-benar akan mengikat kunci tertentu untuk bagian host yang Anda tambahkan, yang tidak akan Anda inginkan jika Anda menggunakan kunci berbeda untuk naksir berbeda).
  • Jawaban yang diterima menyebutkan UseKeychain, tetapi itu tidak cukup untuk bertahan kunci ssh-agentsetelah reboot.
Ricardo Sanchez-Saez
sumber
1
Mengenai poin kedua. Seberapa yakin Anda? Tidak ada yang terjadi saat reboot dan tidak disebutkan dalam materi referensi Anda juga. Apa yang terjadi dengan konfigurasi di atas adalah bahwa klien SSH Anda akan memuat kunci ke agen setelah koneksi pertama (dan itu juga akan mengambil kata sandi dari gantungan kunci), maka kunci akan tetap dimuat. Anda dapat memverifikasi pernyataan ini dengan mendaftar kunci setelah reboot melalui ssh-add -Ldan itu akan melaporkan The agent has no identities. Tidak ada yang akan ada sampai Anda terhubung. Tidak AddKeysToAgentada tombol antara reboot dengan cara apa pun!
Danila Vershinin
15

Saya telah menulis posting singkat tentang topik ini yang mungkin dapat membantu Anda.

Sebuah solusi memanggil ssh-add -Aperintah pada setiap startup.

Cukup tambahkan .plistfile dengan konten berikut ke jalur ~/Library/LaunchAgents/atau buat satu dengan aplikasi Lingon :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->
Jirsbek
sumber
8

Karena macOS 10.12.2 Anda dapat menggunakan UseKeychainopsi ini. Baca lebih lanjut di sini atau lihat man ssh_config.

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

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 tersebut, seperti dijelaskan oleh jawaban mluisbrown atau jawaban ChrisJF .
Cœur
Anda ada di sana :-)
Ben
4

Saya menemukan bahwa ssh-add -Kmemberi saya " opsi ilegal - K ". Ini karena ssh-add adalah versi aneh yang berasal dari / usr / local / bin (diinstal oleh brew?). Saya dapat menambahkan kunci dengan penggunaan khusus dari ssh-add yang terletak di / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa
Fiskabollen
sumber
inilah yang berhasil saya setelah gagal bekerja dengan mudah selama berabad-abad.
nyxee
4

Saya memiliki masalah ini sebelumnya dan saya telah menemukan cara untuk mem-bypass ini. Saya baru saja membuat file bernama configdi ~/.sshfolder saya , di mana saya telah menambahkan baris berikut:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

Saya tidak yakin mengapa, tapi Hostdan HostNamekeduanya penting. Dalam kasus saya jika salah satu dari mereka tidak ada maka solusinya tidak berhasil.

Kemudian, saya hanya melakukan ssh-add -Kdan itu berfungsi bahkan setelah restart.

Infinity
sumber
1
Host adalah nama / alias yang ditentukan pengguna Anda untuk server tertentu dan membatasi entri per server: secara gaya, bagus untuk membuat indentasi baris yang mengikuti entri Host. HostName menunjukkan nama jaringan yang dapat dialamatkan server seperti github.com, tetapi Anda juga dapat menggunakan alamat IP. Host dan HostName tidak harus sama, tetapi ya, keduanya merupakan bagian integral dari format konfigurasi ssh.
Mark Fox
4

Jika Anda menggunakan versi ssh yang berbeda (mis. Diinstal melalui homebrew) solusi di atas tidak akan berfungsi di luar kotak. Misalnya, AddKeysToAgent yesdan UseKeychain yesdalam .ssh/configfile tidak dikenali oleh versi ssh non-Apple dan akan menyebabkan kesalahan. Hal yang sama untuk opsi -Aatau -Kuntuk sshklien.

Itu berarti jawaban @mluisbrown tidak akan berfungsi sama sekali. Anda dapat menggunakan metode 1 dari jawaban @JakeGould dan secara eksplisit menggunakan ssh-addutilitas macOS di Anda .bash_profileuntuk menambahkan semua kunci ke gantungan kunci, yaitu:

/usr/bin/ssh-add -A

Seperti disebutkan oleh komentar di atas , Anda mungkin harus menambahkan kunci ke gantungan kunci terlebih dahulu: mis/usr/bin/ssh-add -K .ssh/github

n1000
sumber
2

Mengubah ~ / .ssh / config untuk menambahkan UseKeyChain untuk semua host sudah cukup untuk menghentikan mimpi buruk yang berulang ini;)

Host *
 UseKeychain yes

Jika file kosong atau tidak ada, buat dan / atau tambahkan konfigurasi di atas dengan mudah.

chim
sumber
1

Saya memperbarui ke Mac OS X Sierra (10.12.6). Saya bisa ssh ke host lain tetapi tidak ke github.com.

Inilah yang harus saya masukkan ke ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Setelah perubahan itu, saya bisa menggunakan github seperti sebelumnya.

Matthias Bohlen
sumber