Исправление ошибки 'Permission denied (publickey)' при отправке в GitHub

Получаете ошибку ‘Permission denied (publickey)’ при попытке отправить изменения в GitHub? Эта ошибка означает, что GitHub не может аутентифицировать вас из-за проблемы с SSH-ключом. Давайте быстро это исправим.
Ключевые моменты
- Ошибка возникает, когда GitHub не может аутентифицировать ваше SSH-соединение
- Три основные причины: отсутствие SSH-ключей, ключи не добавлены в GitHub или неправильный формат URL удалённого репозитория
- Проверьте соединение командой
ssh -T git@github.com
, чтобы убедиться, что проблема решена - SSH-агент и конфигурационные файлы помогают управлять несколькими учётными записями или постоянной аутентификацией
Что означает эта ошибка
Ошибка ‘Permission denied (publickey)’ возникает, когда Git пытается подключиться к GitHub через SSH, но аутентификация не проходит. Представьте SSH-ключи как специальный пароль, который позволяет вашему компьютеру безопасно общаться с GitHub.
Это руководство охватывает три основные причины и показывает, как именно исправить каждую из них.
Три основные причины (и способы их устранения)
1. SSH-ключи не созданы на вашем компьютере
Быстрая проверка:
ls -la ~/.ssh
Если вы видите “No such file or directory” или папка пуста, вам нужно создать SSH-ключи.
Решение: Сгенерируйте новую пару SSH-ключей:
ssh-keygen -t ed25519 -C "your-email@example.com"
Нажмите Enter три раза, чтобы принять значения по умолчанию. Это создаст два файла:
~/.ssh/id_ed25519
(приватный ключ — храните его в секрете)~/.ssh/id_ed25519.pub
(публичный ключ — делитесь с GitHub)
2. Публичный ключ не добавлен в GitHub
Даже при наличии созданных SSH-ключей GitHub не распознает вас, пока вы не добавите свой публичный ключ в свою учётную запись.
Решение: Сначала скопируйте свой публичный ключ:
cat ~/.ssh/id_ed25519.pub
Затем добавьте его в GitHub:
- Перейдите в настройки SSH на GitHub
- Нажмите “New SSH key”
- Вставьте ваш ключ и сохраните
3. Неправильный формат URL удалённого репозитория
SSH URL для GitHub должен начинаться с git@github.com:
— не с вашего email или имени пользователя.
Проверьте текущий URL:
git remote -v
Правильный формат:
git@github.com:username/repository.git
Неправильные форматы:
youremail@github.com:username/repository.git ❌
https://github.com/username/repository.git ❌ (это HTTPS, а не SSH)
Решение: Обновите на правильный SSH URL:
git remote set-url origin git@github.com:username/repository.git
Discover how at OpenReplay.com.
Проверка работоспособности
Протестируйте ваше SSH-соединение с GitHub:
ssh -T git@github.com
Вы должны увидеть:
Hi username! You've successfully authenticated...
Если это работает, теперь вы можете отправлять изменения в GitHub без ошибки отказа в доступе.
Распространённые проблемы и их решение
SSH-агент не запущен
Если ваш ключ существует, но всё равно не работает, возможно, SSH-агент не запущен.
Решение:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Несколько учётных записей GitHub
Управление несколькими учётными записями требует конфигурационного файла SSH. Создайте ~/.ssh/config
:
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
Затем клонируйте, используя:
git clone git@github.com-work:company/repository.git
Особенности для разных платформ
- Пользователи Windows: Используйте Git Bash вместо Command Prompt или PowerShell
- Пользователи macOS/Linux: Используйте Terminal
Обе платформы используют одинаковые команды, показанные выше.
Заключение
Ошибка ‘Permission denied (publickey)’ раздражает, но легко исправляется. В большинстве случаев вам просто нужно создать SSH-ключи и добавить публичный ключ в GitHub. Не забудьте проверить соединение командой ssh -T git@github.com
перед отправкой изменений.
После правильной настройки вы больше никогда не увидите эту ошибку для данного репозитория.
Часто задаваемые вопросы
Хотя технически это возможно, рекомендуется создавать отдельные пары ключей для каждой учётной записи. Это повышает безопасность и упрощает диагностику проблем при управлении различными репозиториями.
SSH удобнее после настройки, так как не требует паролей при каждой отправке. HTTPS работает везде, но требует токенов аутентификации или паролей для каждой операции.
Нет. Добавьте ваш ключ в SSH-агент с помощью ssh-add, чтобы кэшировать парольную фразу на время сеанса. Таким образом, вы введёте её только один раз за сеанс.
Немедленно сгенерируйте новую пару ключей и обновите GitHub новым публичным ключом. Удалите скомпрометированный ключ из настроек GitHub и никогда не делитесь приватными ключами.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.