macOS Sierra, похоже, не помнит SSH-ключи между перезагрузками

185

Я должен запустить эту команду после обновления до MacOS:

ssh-add -K

Устраняет проблему после перезагрузки, но мне приходится запускать эту команду каждый раз, когда я вхожу в свой компьютер.

Если я не запускаю команду, указанную выше, мои ключи ~/.sshпропускаются, и меня просят ввести пароль сервера, чтобы установить соединение.

bisherbas
источник
1
$ ssh-add -Kдает мнеssh-add: illegal option -- K
modius
1
Вам нужно будет ввести путь к закрытому ключу после -K. Смотрите ответ @JakeGould для разрешения.
bisherbas
Обновление 10.12.2 устранило некоторые ненужные запросы на пароль сервера для меня. Теперь вам больше не нужно запускать ssh-add -K.
Wayfaring Незнакомец

Ответы:

216

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

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Со ssh_config manстраницы 10.12.2:

UseKeychain

В macOS указывает, должна ли система искать ключевые фразы в цепочке для ключей пользователя при попытке использовать определенный ключ. Когда пароль предоставляется пользователем, эта опция также указывает, должна ли эта фраза сохраняться в цепочке для ключей, как только она будет проверена на правильность. Аргумент должен быть «да» или «нет». По умолчанию «нет».

mluisbrown
источник
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мод будет работать для клиентов с графическим интерфейсом, использующих ssh, без использования оболочки.
mluisbrown
7
Apple опубликовала Техническую ноту TN2449 относительно этого изменения.
Кензо
107

У меня также была эта проблема при попытке развернуть некоторый код с помощью 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параметр конфигурации для настроек 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.

JakeGould
источник
4
@modius: если у вас есть защищенный ключ pw, ssh-add -K [path to key]введите и введите pw при появлении запроса. Брелок сохранит пароль, а ssh-add получит его оттуда.
Тимо
2
Обратите внимание, что -A для добавления идентификаторов в агент с использованием любых парольных фраз, хранящихся в вашей цепочке для ключей. Если у вас дополнительно есть идентификаторы без парольных фраз, вам нужно будет опустить опцию -A, чтобы добавить их в ваш агент.
Эван Пон
12
Просто для того, чтобы добавить немного большей наглядности, Apple обновила справочную страницу для ssh_config, чтобы включить UseKeychainи AddKeysToAgentавтоматически добавлять ваши ключи из вашего ssh_config. Не требуется сценарий оболочки. См. Ответ @mluisbrown ниже для обновленной информации для 10.12.2
Райан Гиббонс
1
@ Джейк, могу ли я получить то, что вы говорите, мне действительно нравится то, что они делают. Вместо того, чтобы автоматически сохранять парольную фразу в цепочке для ключей и загружать ее при загрузке, они дают вам контроль над вашей безопасностью. / пожимание плечами
Райан Гиббонс
1
@RyanGibbons FWIW, посмотрите на официальное предложение от Apple Developer Relations в этом ответе на OpenRadar: «Вы можете довольно легко это исправить, запустив ssh-add -Aсвой rc-скрипт, если вы хотите, чтобы ваши ключи всегда загружались». ¯\_(ツ)_/¯
JakeGould
16

Как объясняется здесь , это рекомендуемый метод начиная с macOS 10.12.2 :

  1. Добавьте следующие строки в ваш ~/.ssh/configфайл:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Любой ключ, который вы добавляете в ssh-agent с помощью 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 -->
Jirsbek
источник
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
Fiskabollen
источник
это то, что сработало у меня после того, как я не мог легко работать веками.
nyxee
4

У меня была эта проблема раньше, и я нашел способ обойти это. Я только что создал файл с именем configв моей ~/.sshпапке, где я добавил следующие строки:

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

Я не уверен, почему, но Hostи то и HostNameдругое важно. В моем случае, если одного из них не было, решение не сработало.

Затем я просто сделал, ssh-add -Kи это работало даже после перезагрузки.

бесконечность
источник
1
Хост - это пользовательское имя / псевдоним для конкретного сервера, который разграничивает записи для каждого сервера: стилистически удобно выделять строки, следующие за записью хоста. HostName указывает сетевое адресуемое имя сервера, например, github.com, но вы также можете использовать IP-адрес. Host и HostName не обязательно должны совпадать, но да, они оба являются неотъемлемой частью формата конфигурации ssh.
Марк Фокс
4

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

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

/usr/bin/ssh-add -A

Как уже упоминалось в комментарии выше , вам может понадобиться сначала добавить ключ в цепочку ключей: например,/usr/bin/ssh-add -K .ssh/github

N1000
источник
2

Поправки ~ / .ssh / config для добавления UseKeyChain для всех хостов достаточно, чтобы остановить этот повторяющийся кошмар;)

Host *
 UseKeychain yes

Если файл пуст или не существует, просто создайте и / или добавьте указанную выше конфигурацию.

Хим
источник
1

Я обновился до Mac OS X Sierra (10.12.6). Я мог бы ssh на других хостах, но не на github.com.

Вот что я должен был вставить в ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

После этого изменения я мог использовать github, как и раньше.

Матиас Болен
источник