135

Я понимаю, что после Mac OS X Leopard связка ключей поддерживает хранение ключей SSH. Может кто-нибудь объяснить, как эта функция должна работать.

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

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

(Я написал несколько функций Bash, чтобы сделать это проще.)

Есть ли лучший способ сделать это с помощью брелка?

9 ответов9

249

Начиная с версии Leopard OS X, ssh-agent более тесно интегрирован с Keychain. Можно надежно хранить пароли всех ваших ключей SSH в связке ключей, откуда ssh-agent будет читать их при запуске. Суть в том, что ваши ключи просто защитить паролем, но вам никогда не придется вводить парольную фразу, чтобы использовать их! Вот как:

Добавьте парольную фразу к каждому ключу ssh в цепочку для ключей: (опция -k загружает только простые личные ключи, пропускает сертификаты)

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

(обратите внимание, что это заглавная K)

Всякий раз, когда вы перезагружаете свой Mac, все ключи SSH в вашей цепочке для ключей будут автоматически загружены. Вы должны увидеть ключи в приложении Keychain Access, а также из командной строки:

ssh-add -l
75

Что касается macOS Sierra, ssh-agent больше не загружает автоматически загруженные ранее ssh-ключи при входе в свою учетную запись. Это намеренно со стороны Apple, они хотели переориентироваться на основную реализацию OpenSSH . [1]


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

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

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


Следующее не рекомендуется (сохраняется для справки).

Чтобы вернуться к предыдущему поведению, вы должны выполнить команду ssh-add -A (которая автоматически загружает все ключи ssh, которые имеют парольные фразы в цепочке для ключей) при входе в систему. Для этого выполните следующие действия:

  1. Сначала добавьте все ключи, которые вы хотите автоматически загрузить в ssh-agent, используя команду ssh-add -K /absolute/path/to/your/private/key/id_rsa . Аргумент -K обеспечивает добавление ключевой фразы в цепочку ключей macOS . Убедитесь, что вы используете абсолютный путь к ключу. Использование относительного пути заставит автоматически запускаемый скрипт не найти ваш ключ.

  2. Убедитесь, что все ваши ключи отображаются как добавленные при ssh-add -A .

  3. Создайте файл с именем com.yourusername.ssh-add.plist в ~/Library/LaunchAgents/ с содержимым ниже. Файлы Plist, такие как этот, используются launchd для запуска сценариев при входе в систему. [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. Скажите launchd чтобы загрузить файл plist, который вы только что создали, выполнив: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist .

И у тебя должно быть все готово.

30

Есть более простой способ, чем ответ Рикардо, чтобы сохранить ваш пароль между сессиями / перезапусками вашего Mac под управлением 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Примечание: измените путь к месту, где находится ваш ключ id_rsa.
  2. ssh-add -A
  3. Создайте (или отредактируйте, если он существует) следующий файл ~/.ssh/config :

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

    Теперь пароль запоминается между перезагрузками!

Apple намеренно изменила поведение ssh-agent в macOS 10.12 Sierra, чтобы больше не загружать автоматически предыдущие SSH-ключи, как отмечалось в этом обсуждении OpenRadar, Twitter и Техническом примечании от Apple. Приведенное выше решение будет имитировать старое поведение El Capitan и запоминать ваш пароль.

16

Чтобы это работало, переменная окружения $SSH_AUTH_SOCK должна указывать на /tmp/launch-xxxxxx/Listeners . Это должно быть сделано автоматически при входе в систему. Слушатель на этом сокете говорит по протоколу ssh-agent.

Ваши bash-скрипты запускают ваш собственный ssh-агент (пишется ssh-agent , а не ssh_agent) и переопределяют существующий ssh-agent который настроен для вас при входе в систему.

Кроме того, весь смысл цепочки для ключей состоит в том, чтобы хранить пароли к вашим ssh-ключам, но вы говорите, что у вас не установлены парольные фразы для этих ключей, поэтому я не уверен, что вы ожидаете от интеграции цепочки для ключей.

Наконец, при первом входе в систему вы, вероятно, не увидите процесс ssh-agent. Этот процесс будет запущен автоматически службами запуска, когда кто-то попытается прочитать этот сокет в /tmp .

9

Примечание: для macOS Sierra, пожалуйста, обратитесь к более свежему ответу ChrisJF.

[Ответ Джеффа МакКаррелла] [2] является правильным, за исключением того, что команда для добавления ключевой фразы содержит дефис, а не дефис, то есть –K вместо -K , вызывая сообщение с эффектом –K: No such file or directory . Следует читать:

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

Я подозреваю, что вы не используете команду ssh по умолчанию. У вас ssh установлен через порты? Попробуйте, which ssh увидеть, какую команду ssh вы используете.

Обычно должно отображаться диалоговое окно с запросом вашего пароля, если он еще не сохранен в вашей цепочке для ключей.

6

У меня была похожая проблема при попытке войти в систему, используя сертификат ssh клиента. В этом конкретном случае это было для доступа к хранилищу git. Это была ситуация:

  • Ключ был сохранен в ~/.ssh/
  • Закрытый ключ имеет парольную фразу.
  • Фраза-пароль хранится в цепочке ключей входа OS X. ~/Library/Keychains/login.keychain
  • Соединение было следующим: мой mac -> удаленный mac -> git/ssh server
  • Mac OS X 10.8.5

Когда я подключился к удаленному Mac с помощью удаленного рабочего стола, у меня не было проблем. Однако при подключении по SSH к удаленному компьютеру Mac каждый раз меня спрашивали о парольной фразе ssh. Следующие шаги решили это для меня.

  1. security unlock-keychain Пароль хранится в цепочке ключей входа. Это разблокирует его и позволит ssh-agent получить к нему доступ.
  2. eval `ssh-agent -s` Запускает ssh-agent для использования в оболочке. Он получит ключевую фразу из цепочки для ключей и использует ее для разблокировки закрытого ключа ssh.
  3. Установите соединение ssh/git и сделайте мою работу.
  4. eval `ssh-agent -k` Убить работающий ssh-agent.
  5. security lock-keychain keychain Снова заблокируйте брелок.
4

Смотрите также:

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

... добавив это примечание, так как было запрошено больше подробностей: команда "security" способна импортировать ключи (и другие вещи) непосредственно в цепочки для ключей. Приятно то, что в отличие от ssh-add, вы можете указать цепочку для ключей. Это позволяет импортировать напрямую в систему Keychain ("man security", чтобы узнать, как)

1

Лучшее решение Apple (начиная с macOS 10.12.2) описано здесь

Так что просто сделайте следующее:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .