Как использовать Mac OS X Keychain с ключами SSH?

139

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

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

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

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

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

Джон Топли
источник

Ответы:

16

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

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

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

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

Rudedog
источник
1
Благодарю. Таким образом, мне все еще нужно будет запустить, ssh-addчтобы добавить мои идентификаторы RSA в агент ssh по умолчанию, запущенный при входе в систему?
Джон Топли
Вам не нужно запускать ssh-add; ssh-agent будет запрашивать пароль при первом запуске ssh.
Rudedog
3
Он запрашивает у меня пароль каждый раз, когда я запускаю ssh. Дело в том, что я не хочу вводить какие-либо пароли.
Джон Топли
1
Что подсказывает вам пароль? Я начинаю подозревать, что это удаленный сервер, который подсказывает вам, что говорит о том, что ваши ключи не имеют парольных фраз в лучшей перспективе. Если вы хотите обойти пароль на удаленном сервере, вам нужно добавить свой открытый ключ $HOME/.ssh/authorized_keysна этом сервере. Mac OS 'ssh-agent + keychain используется только для хранения ключевой фразы для ваших локальных ключей ssh; он не предназначен для отправки удаленных паролей через существующие соединения ssh.
Rudedog
1
используйте ssh -vдля диагностики того, что делает ssh. также использовать sshd -p 8900 -vна стороне сервера и ssh -v remote:8900для диагностики того, что делает sshd.
Rudedog
252

Начиная с версии 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
jeffmcc
источник
ssh-add -lне отображает никаких ключей при удаленном подключении (где $ DISPLAY не установлен). Здесь необходимо использовать специальные приемы для использования цепочки для ключей (например, в superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… Вам также нужна опция -K для хранения парольных фраз в цепочке для ключей.
Neeme Praks
5
Если вы установили другую версию SSH через систему пакетов, такую ​​как Homebrew, то необходимо использовать абсолютный путь, например /usr/bin/ssh-add.
Людовик Куты
1
Интересно, что в моей macOS Sierra он не запрашивает пароль после перезагрузки, а ssh-add -lвозвращает «Агент не имеет идентификаторов». ( ps auxвключает в себя /usr/bin/ssh-agent -l).
Халил Озгюр
4
Для macOS Sierra все изменилось. См github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
77

Что касается 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.

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

Рикардо Санчес-Саез
источник
Связанный: apple.stackexchange.com/questions/48502/...
слй
33

Есть более простой способ, чем ответ Рикардо, чтобы сохранить ваш пароль между сессиями / перезапусками вашего 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 и запоминает ваш пароль.

ChrisJF
источник
2
Круто, работает как шарм, imho намного чище, чем другие, и решено в нужном месте :)
GerardJP
10

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

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

ssh-add -K [path/to/private SSH key]
simonair
источник
2
Это должен быть комментарий к ответу, на который вы ссылаетесь, а не свежий ответ. Мы говорим о безопасности здесь. Можно предположить, что вы должны тщательно печатать его, а не слепо копировать и вставлятьssh-add -K
Phil_1984_
1
Используя дефис с K, я получаю illegal option -- K. Строчная k указана в качестве опции.
Сэм Даттон
Спасибо за ответ. Я только что проверил на macOS Sierra: -Kто есть dash-capital-K, все еще действует
simonair
6

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

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

Olly
источник
Я не использую порты.
Джон Топли
Спасибо за информацию :) У меня были проблемы, потому что я использовал OpenSSH от Homebrew.
ggustafsson
6

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

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

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

  1. security unlock-keychainКлючевая фраза хранится в цепочке ключей входа в систему. Это разблокирует его и позволит ssh-agent получить к нему доступ.
  2. eval `ssh-agent -s`Запускает ssh-агент для использования оболочки. Он получит ключевую фразу из цепочки для ключей и использует ее для разблокировки закрытого ключа ssh.
  3. Установите соединение ssh / git и сделайте мою работу.
  4. eval `ssh-agent -k` Убей работающего ssh-агента.
  5. security lock-keychain Снова заблокируйте брелок.
orkoden
источник
1
Для того, чтобы # 2 работал для меня в псевдониме, мне пришлось использовать eval \$(ssh-agent)Per Re: удаленный вход в систему и связку ключей . Когда не в псевдониме eval $(ssh-agent)работает ( без обратной косой черты $ ).
Трэвис
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», чтобы узнать, как)

xaphod
источник
1
Не могли бы вы немного подробнее рассказать об этом ответе? Благодарю.
Мэтью Уильямс,
1

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

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

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

Бен
источник
1
Использование >>под угрозой, если вы вводите команду несколько раз. Лучше сделать ручную редакцию файла, как описано в ответе ChrisJF .
Cœur
Да, вы тут же
Бен