DevOps

Ошибка ssh-add: нет соединения с агентом для Heroku

Пошаговое решение ошибки 'Could not open a connection to your authentication agent' при ssh-add для SSH-ключей Git и Heroku. Запуск ssh-agent, добавление приватного ключа, настройка heroku keys:add и отладка авторизации.

Как решить ошибку ‘Could not open a connection to your authentication agent’ при добавлении SSH-ключей для Git и развертывания на Heroku?

Я сталкиваюсь со следующей ошибкой при попытке добавить мой SSH-ключ:

$ ssh-add ~/.ssh/id_rsa.pub
Could not open a connection to your authentication agent.

Это мешает мне отправлять код в Heroku, где возникает следующая ошибка:

$ git push heroku master
Warning: Permanently added the RSA host key for IP address '50.19.85.132' to the list of known hosts.
! Your key with fingerprint b7:fd:15:25:02:8e:5f:06:4f:1c:af:f3:f0:c3:c2:65 is not authorized to access bitstarter.

Какие шаги следует предпринять для правильной настройки SSH-аутентификации и решения этих проблем?

Ошибка “Could not open a connection to your authentication agent” обычно означает, что ssh-agent не запущен или переменная окружения SSH_AUTH_SOCK недоступна в текущем сеансе — и при этом вы пытаетесь добавить публичный ключ (.pub) вместо приватного через ssh-add. Исправление: запустите агент (eval "$(ssh-agent -s)"), добавьте приватный ключ (ssh-add ~/.ssh/id_rsa или ssh-add ~/.ssh/id_ed25519), затем загрузите публичный ключ в аккаунт Heroku (heroku keys:add ~/.ssh/id_rsa.pub) и проверьте ssh-add -l и heroku keys. Если Heroku выдаёт “key not authorized”, очистите лишние ключи (ssh-add -D и heroku keys:clear) и укажите конкретный IdentityFile в ~/.ssh/config.


Содержание


Запуск ssh-agent и добавление ключа (ssh-add)

Почему это происходит? Потому что ssh-add общается с фоновым процессом — ssh-agent — через unix-сокет, путь к которому хранится в переменной SSH_AUTH_SOCK. Если агента нет или переменная не установлена, вы увидите ошибку “Could not open a connection to your authentication agent”.

Быстрый набор команд (bash / zsh):

bash
# запустить агент и сохранить переменные в текущем сеансе
eval "$(ssh-agent -s)"

# добавить приватный ключ (ВАЖНО — приватный, не .pub)
ssh-add ~/.ssh/id_rsa # или ~/.ssh/id_ed25519

# проверить, какие ключи загружены
ssh-add -l

# убедиться, что сокет установлен
echo "$SSH_AUTH_SOCK"

Если вы используете csh/tcsh:

csh
eval `ssh-agent -c`
ssh-add ~/.ssh/id_rsa

Несколько практических замечаний:


Добавление SSH-ключа: приватный vs публичный (.pub)

Частая ошибка — попытка запустить ssh-add для публичного ключа:

bash
# НЕ так — это добавляет публичный ключ, чего ssh-agent не ожидает
ssh-add ~/.ssh/id_rsa.pub
# -> Could not open a connection to your authentication agent. (и/или другая ошибка)

ssh-agent хранит приватные ключи — поэтому правильно:

bash
ssh-add ~/.ssh/id_rsa # приватный
# или для ed25519
ssh-add ~/.ssh/id_ed25519

Если ключа нет или хотите создать новый (современный и короткий):

bash
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
# либо RSA 4096 бит:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/id_rsa

Генерация, добавление приватного ключа в агент и затем загрузка публичного ключа на сервис — правильная последовательность.


Добавление ключа в Heroku и проверка доступа

Heroku ожидает, что у него на аккаунте будет ваш публичный ключ, а при push вы будете аутентифицироваться приватным ключом (через агент или напрямую). Официальная инструкция — в документации Heroku: https://devcenter.heroku.com/articles/keys

Типичный порядок действий:

  1. Убедитесь, что агент запущен и приватный ключ добавлен (см. раздел выше).
  2. Загрузите публичный ключ в аккаунт Heroku:
bash
heroku keys:add ~/.ssh/id_rsa.pub

или просто heroku keys:add — CLI предложит варианты.
3. Посмотреть, какие ключи у вас в аккаунте Heroku:

bash
heroku keys
  1. Если сервер возвращает “Your key with fingerprint … is not authorized to access ”, проверьте:
  • Вы вошли в нужный Heroku-аккаунт: heroku whoami (подстановка правильного аккаунта критична). Документация по аутентификации: https://devcenter.heroku.com/articles/authentication
  • На клиенте загружен тот приватный ключ, который соответствует публичному ключу в Heroku: ssh-add -l и сравните отпечаток.
  • Удалите старые/неправильные серверные ключи: heroku keys:clear, затем добавьте нужный.
  1. Диагностика SSH при push:
bash
# показать подробный вывод ssh при push
GIT_SSH_COMMAND="ssh -v" git push heroku master
# или протестировать напрямую
ssh -v git@heroku.com

Если у вас несколько аккаунтов или ключей, полезно настроить ~/.ssh/config (см. раздел про multiple-keys).


Пошаговая отладка: что проверить сначала

Пошаговый чеклист (выполняйте по порядку):

  • Шаг 1 — агент: eval "$(ssh-agent -s)" и ssh-add ~/.ssh/id_rsa.
  • Шаг 2 — убедиться, что добавлен приватный ключ: ssh-add -l.
  • Шаг 3 — если много ключей, почистите: ssh-add -D, затем добавьте только тот, который нужен Heroku.
  • Шаг 4 — проверить публичный ключ в аккаунте Heroku: heroku keys и при необходимости heroku keys:clear + heroku keys:add ~/.ssh/id_rsa.pub.
  • Шаг 5 — проверить удалённый git-remote: git remote -v — URL должен быть git@heroku.com:your-app.git. При сомнениях выполните heroku git:remote -a your-app.
  • Шаг 6 — запустить verbose-режим для SSH: GIT_SSH_COMMAND="ssh -v" git push heroku master — в выводе видно, какой ключ используется и почему доступ отклонён.
  • Шаг 7 — проверьте, не использует ли система другой агент (Pageant / Windows agent). Для WSL/Windows — см. специальные разделы и обсуждение: https://superuser.com/questions/1363150/windows-subsystem-for-linux-ubuntu-ssh-agent-running-but-ssh-add-complains-cou

Ещё одна причина — слишком много ключей: SSH по умолчанию пробует несколько ключей, и сервер может “закрыть” попытки. Об этом аккуратно написано в обсуждениях: https://stackoverflow.com/questions/8786564/cannot-push-to-heroku-because-key-fingerprint


Права доступа и безопасность ключей

Неправильные права на файлы .ssh и ключи тоже ломают аутентификацию. Рекомендация:

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa # приватный ключ
chmod 644 ~/.ssh/id_rsa.pub # публичный ключ (можно 644)
chmod 600 ~/.ssh/authorized_keys # если используете authorized_keys на сервере

В некоторых инструкциях предлагают chmod 400 для приватного ключа — это тоже работает, главное — чтобы файл был недоступен для посторонних. См. обсуждение ошибки “Unprotected private key file”: https://stackoverflow.com/questions/25869207/getting-warning-unprotected-private-key-file-error-message-while-attempting/56593424#56593424


Особенности Windows, WSL и Git Bash

Windows и WSL могут вести себя иначе:

  • Git Bash и OpenSSH в Windows: убедитесь, что используете тот же ssh-agent, где находятся переменные окружения. Для Git Bash запускайте eval "$(ssh-agent -s)" внутри Git Bash и затем ssh-add.
  • WSL: если агент был запущен в Windows, переменная SSH_AUTH_SOCK может не быть автоматически видна в WSL; для этого есть паттерны перенаправления или нужно запустить агент внутри WSL. Пример решения и обсуждение: https://superuser.com/questions/1363150/windows-subsystem-for-linux-ubuntu-ssh-agent-running-but-ssh-add-complains-cou
  • Putty/Pageant: если вы используете PuTTY, то ключи в формате .ppk добавляются в Pageant, а не через ssh-add. В таком случае либо используйте Pageant + PuTTY-плагин, либо конвертируйте ключ в OpenSSH-формат и используйте ssh-add.

И да — иногда антивирус на Windows блокирует или кладёт в карантин ssh-agent.exe (такое случалось в реальности). Если ничего не помогает, проверьте логи антивируса: https://qna.habr.com/q/1142754


Несколько ключей и ~/.ssh/config (IdentityFile)

Если у вас несколько приватных ключей (для GitHub, GitLab, Heroku и т.д.), настройте ~/.ssh/config, чтобы ssh использовал нужный ключ для Heroku и не пытался применять все подряд:

Host heroku.com
 HostName heroku.com
 User git
 IdentityFile ~/.ssh/id_rsa_heroku
 IdentitiesOnly yes

Пара моментов:

  • IdentitiesOnly yes заставляет SSH использовать только указанный IdentityFile, что устраняет проблему “слишком много попыток авторизации”.
  • После изменения ~/.ssh/config можно перепривязать remote, если нужно:
bash
git remote set-url heroku git@heroku.com:your-app.git
# или
heroku git:remote -a your-app

Если вы используете специальный плагин/инструмент для нескольких аккаунтов Heroku (ddollar/heroku-accounts), проверьте настройки .git/config — часто проблема в неверном URL удалённого репозитория: https://github.com/ddollar/heroku-accounts/issues/45


Источники


Заключение

Коротко: запустите ssh-agent, добавьте приватный ключ через ssh-add (не .pub), загрузите публичный ключ в Heroku через heroku keys:add и проверьте, какой ключ реально используется (ssh-add -l, GIT_SSH_COMMAND="ssh -v" git push heroku master). Если ошибка “key not authorized” остаётся — очистите лишние ключи (локально и в аккаунте Heroku), убедитесь, что вы в том же Heroku-аккаунте (heroku whoami), и при необходимости зафиксируйте нужный ключ через ~/.ssh/config. Следуя этим шагам, вы устраните ошибку “Could not open a connection to your authentication agent” и восстановите возможность пуша на Heroku.

Авторы
Проверено модерацией
Модерация
Ошибка ssh-add: нет соединения с агентом для Heroku