macOS Sierra, схоже, не пам’ятає ключі SSH між перезавантаженнями


184

Мені потрібно запустити цю команду після оновлення до macOS:

ssh-add -K

Виправляє проблему після перезавантаження, але мені потрібно запускати цю команду кожного разу, коли я входжу на свій комп’ютер.

Якщо я не запускаю команду вище, мої ключі ~/.sshпропускаються, і мені запитують пароль сервера, щоб встановити з'єднання.


1
$ ssh-add -Kдає меніssh-add: illegal option -- K
модиус

1
Після цього вам потрібно буде ввести шлях приватного ключа -K. Дивіться відповідь @JakeGould для вирішення.
Бішербас

Оновлення 10.12.2 усунуло деякі непотрібні для мене запити пароля сервера. Зараз вам більше не потрібно запускати ssh-add -K.
Шлях до незнайомця

Відповіді:


215

Станом на macOS Sierra 10.12.2 Apple додала ssh_configопцію, UseKeychainяка називається, що дозволяє «належне» вирішення проблеми. Додайте у ~/.ssh/configфайл наступне :

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Зі ssh_config manсторінки 10.12.2:

UseKeychain

У macOS визначає, чи повинна система шукати паролі у брелоку користувача при спробі використання певного ключа. Коли пропускна фраза надається користувачем, ця опція також визначає, чи слід зберігати пароль у брелок після перевірки його правильності. Аргумент повинен бути "так" або "ні". За замовчуванням - "ні".


2
За цим посиланням: openradar.appspot.com/27348363 Apple "переозброїла [свою] поведінку з основним OpenSSH в цій області".
ThomasW

15
Абсурдно, що Apple модифікувала поведінку таким чином, що спричинить проблеми для переважної більшості розробників (через натискання GitHub, якщо нічого іншого) і нікому нічого не говорила!
mluisbrown

9
Я думаю, що IdentityFile ~/.ssh/id_rsaце зайве і не потрібне (коли дивишся на параметри за замовчуванням). Я ніколи не встановлював цю опцію у своєму конфігураційному файлі ssh.
therealmarv

9
@JakeGould Зміна IMO ~/.ssh/config~є кращою, оскільки вона вирішує проблему на sshрівні. Не на 100% впевнений, що .bash_profileмод буде працювати для клієнтів GUI, що використовують ssh без використання оболонки.
mluisbrown

7
Apple опублікувала технічну примітку TN2449 щодо цієї зміни.
Кенцо

106

У мене виникла ця проблема і при спробі розгорнути якийсь код за допомогою Capistrano . Дуже засмучує. Ось два способи, які я знаю, для вирішення цього питання.

Спосіб 1: Додайте всі відомі ключі до агента SSH.

Таким чином , один рішення , яке я знайшов, щоб працювати ssh-addз -Aопцією-який додає всі відомі особистості до SSH агентом з використанням ключових фраз , що зберігаються у вашій брелоку-як це:

ssh-add -A

Тепер це працює, але не буде зберігатися через перезавантаження. Тож якщо ви більше ніколи не хочете про це турбуватися, просто відкрийте ~/.bash_profileфайл користувача таким чином:

nano ~/.bash_profile

І додайте цей рядок донизу:

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

Тепер, коли ви відкриєте нове вікно терміналу, все повинно бути добре!

Спосіб 2. Додайте до агента лише ключі SSH, які знаходяться в брелоку .

Тому, хоча ця ssh-add -Aопція повинна працювати в більшості основних випадків, я нещодавно зіткнувся з проблемою, де у мене було 6-7 короблярів Vagrant (для використання яких використовуються SSH-ключі / посвідчення) на машині поверх більш поширених id_rsa.pubна місці.

Коротше кажучи, я опинився закритим на віддаленому сервері через занадто багато спроб на основі ключів / ідентичностей SSH, оскільки доступ до сервера був заснований на паролі, а SSH-ключі / ідентичності - SSH-ключі / ідентичності. Тож агент SSH спробував усі мої SSH ключі, не вдався, і я навіть не зміг дійти до запиту пароля.

Проблема полягає в тому ssh-add -A, що просто довільно додаватимуть кожен агент SSH-ключ / ідентифікатор, який ви маєте, навіть якщо цього не потрібно; наприклад, у випадку з бродячими коробками.

Моє рішення після довгого тестування було наступним.

По-перше, якщо до вашого агента додано більше SSH-ключів / ідентифікацій, ніж вам потрібно, як показано, а ssh-add -lпотім очистіть їх усі від агента так:

ssh-add -D

Зробивши це, тоді запустіть агент SSH як фоновий процес, наприклад:

eval "$(ssh-agent -s)"

Тепер це стає дивно, і я не дуже впевнений, чому. У деяких випадках ви можете спеціально додати ~/.ssh/id_rsaключ / ідентифікатор до агента так:

ssh-add ~/.ssh/id_rsa

Введіть свою парольну фразу, натисніть, Returnі вам слід добре піти.

Але в інших випадках просто запуску цього достатньо, щоб додати ключ / ідентифікацію:

ssh-add -K

Якщо це все спрацювало, введіть ssh-add -lі ви побачите один самотній ключ / ідентифікатор SSH у списку.

Все добре? Тепер відкрийте свої .bash_profile:

nano ~/.bash_profile

І додайте цей рядок донизу; коментуйте або видаліть -Aверсію, якщо у вас є така:

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

Це дозволить SSH-ключ / ідентифікацію перезавантажуватись до агента SSH під час кожного запуску / перезавантаження.

ОНОВЛЕННЯ: Apple тепер додала UseKeychainопцію до відкритих параметрів конфігурації SSH, а також розглядає ssh-add -Aрішення.

Станом на macOS Sierra 10.12.2, Apple додала UseKeychainпараметр config для конфігурацій SSH. Перевірка довідкової сторінки (через man ssh_config) показує таку інформацію:

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''.

Що зводиться до Apple, бачачи рішення як додавання ssh-add -Aдо вашого, .bash_profile як пояснено в путівці на Open Radar, так і UseKeychainяк одне з варіантів для кожного користувача ~/.ssh/config.


4
@modius: якщо у вас є захищений pw ключ, зробіть ssh-add -K [path to key]і введіть pw, коли буде запропоновано. Keychain збереже пароль, а ssh-add отримає його звідти після цього.
Тимо

2
Зверніть увагу, -A призначений для додавання ідентифікаторів до агента за допомогою будь-яких парольних фраз, збережених у вашому брелоку. Якщо у вас додатково є особистість без парольних фраз, вам потрібно буде пропустити опцію -A, щоб додати їх до свого агента.
Еван Пон

12
Для того, щоб додати трохи більшої видимості цьому, Apple оновила довідкову сторінку для ssh_config, щоб включити UseKeychainта AddKeysToAgentавтоматично додати ваші ключі від вашого ssh_config. Не потрібні сценарії оболонок. Дивіться @mluisbrown відповідь нижче для оновленої інформації за 10.12.2
Ryan Gibbons

1
@JakeGould я можу отримати те, що ви говорите, мені насправді подобається те, що вони роблять. Замість того, щоб автоматично зберігати парольну фразу в брелок і завантажувати її під час завантаження, вони дають вам контроль над вашою безпекою. / знизують плечима
Ryan Gibbons

1
@ RyanGibbons FWIW, подивіться на офіційну пропозицію Apple Developers Relations у цій відповіді на OpenRadar: "Ви можете це легко виправити, запустивши ssh-add -Aу свій сценарій rc, якщо ви хочете, щоб ваші ключі завжди завантажувались". ¯\_(ツ)_/¯
JakeGould

16

Як пояснено тут , це рекомендований метод, починаючи з macOS 10.12.2 :

  1. Додайте у ~/.ssh/configфайл наступні рядки :

    Host *
        UseKeychain yes
        AddKeysToAgent yes
  2. Будь-який ключ, який ви додасте до ssh-агента за допомогою ssh-add /path/to/your/private/key/id_rsaкоманди, буде автоматично доданий до брелка і повинен бути автоматично завантажений при перезавантаженні.


Я додаю цю відповідь, оскільки:

  • Інші відповіді говорять про те, щоб додати IdentityFile ~/.ssh/id_rsaрядок, але цей параметр не потрібен для автоматичного завантаження ключів (і він фактично прив’яже цей конкретний ключ для хост-розділу, до якого ви додасте його, чого ви не хочете, якщо використовуєте різні клавіші для різні хоти).
  • Прийнята відповідь згадує UseKeychain, але цього недостатньо для збереження ключів ssh-agentпісля перезавантаження.

1
Щодо другого пункту. Наскільки ви впевнені? Насправді нічого не відбувається при перезавантаженні, і це не згадується у вашому довідковому матеріалі. Що відбувається з наведеним вище конфігурацією, це те, що ваш клієнт SSH завантажить ключ до агента при першому з'єднанні (і він також отримає фразу з брелка), тоді ключ залишиться завантаженим. Ви можете перевірити цю заяву, перерахувавши ключі відразу після перезавантаження через, ssh-add -Lі вона повідомить The agent has no identities. Нічого там не буде, поки ви не підключитесь. AddKeysToAgentЧи не зберігаються ключі між перезавантаженнями в будь-якому випадку!
Данила Вершинін

15

Я написав короткий пост на цю тему, який може вам допомогти.

Рішення викликає ssh-add -Aкоманду при кожному запуску.

Просто додайте .plistфайл із таким вмістом у шлях ~/Library/LaunchAgents/або створіть його за допомогою програми 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 -->

8

Оскільки macOS 10.12.2 ви можете скористатися UseKeychainопцією. Детальніше читайте тут або дивіться 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''.

Тому просто виконайте наступне:

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


1
Використання >>загрожує, якщо ввести команду кілька разів. Краще виконати вручну видання файлу, як описано у відповіді mluisbrown або у відповідь ChrisJF .
Cœur

Ви прямо там :-)
Бен

4

Я виявив, що ssh-add -Kдав мені " незаконний варіант - К ". Це було через те, що ssh-add була дивною версією, що надходила з / usr / local / bin (встановлена ​​brew?). Мені вдалося додати ключ, використовуючи ssh-add, розташований у / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa

це те, що працювало в мене після того, як не працював легко протягом віків.
nyxee

4

У мене була ця проблема раніше, і я знайшов спосіб її обійти. Я щойно створив файл, названий configу своїй ~/.sshпапці, куди я додав наступні рядки:

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

Я не впевнений, чому, але Hostі те і HostNameінше важливо. У моєму випадку, якщо одного з них не було, рішення не працювало.

Тоді я щойно зробив ssh-add -Kі він працював навіть після перезавантаження.


1
Хост - це визначене користувачем ім’я / псевдонім для певного сервера і розмежовує записи на одному сервері: стилістично приємно відступати рядки, що слідують за записом Host. HostName вказує мережеве адресоване ім’я сервера, як github.com, але ви також можете використовувати IP-адресу. Host та HostName не повинні бути одне і те ж, але так, вони є невід'ємною частиною формату ssh config.
Марк Фокс

4

Якщо ви використовуєте іншу версію ssh (наприклад, встановлену через homebrew), наведені вище рішення не вийдуть з коробки. Наприклад, AddKeysToAgent yesі UseKeychain yesу .ssh/configфайлі не розпізнаються не-ssh-версіями Apple, і це призведе до помилки. Те саме для клієнта -Aабо -Kваріант ssh.

Це означає , що відповідь @mluisbrown взагалі не буде працювати. Ви можете використовувати метод 1 відповіді @JakeGould і явно використовувати ssh-addутиліту macOS у вашому, .bash_profileщоб додати всі ключі до брелка, тобто:

/usr/bin/ssh-add -A

Як зазначається в коментарі вище , можливо, вам доведеться спочатку додати ключ до брелка: наприклад/usr/bin/ssh-add -K .ssh/github


2

Зміни ~ / .ssh / config, щоб додати UseKeyChain для всіх хостів, достатньо, щоб зупинити цей повторюваний кошмар;)

Host *
 UseKeychain yes

Якщо файл порожній або не існує, просто створіть та / або додайте вищевказану конфігурацію.


1

Я оновився до Mac OS X Sierra (10.12.6). Я можу перейти до інших хостів, але не до github.com.

Ось що мені довелося вставити в ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Після цієї зміни я міг би використовувати github, як і раніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.