web development
October 18

GitHub. Пароли, токены, ssh-ключи. Error 403.

Часто в начале работы с GitHub можно столкнуться с проблемой аутентификации. Вот ты завел аккаунт на GitHub, создал проект (репозиторий), скачал его на компьютер и внеся изменения попробовал выполнить команду в терминале git push. В терминале появились запросы ввести логин и пароль. Ты вводишь свои данные от аккаунта GitHub и получаешь ошибку 403 Permission denied - ошибку аутентификации.

> remote: Permission to [название репозитория] denied to [логин].
> fatal: «https://github.com/.../» недоступно: The requested URL returned error: 403

Давай по шагам пройдем этот квест: уберем ошибки, настроим безопасные способы аутентификации и настроим удобную работу с GitHub.

Ошибка 403 при git push / git pull

Если в терминале при git push / git pullв GitHub репозиторий ты вводишь логин пароль от GitHub аккаунта и получаешь ошибку 403 Permission denied, то ты пытаешься аутентифицироваться через HTTPS с логином/паролем, но GitHub с августа 2021 года больше не принимает обычные пароли для операций git push / git pull . Вместо этого нужно использовать Personal Access Token (PAT) или перейти на SSH-ключи.

### Проверь вводимые данные

  • Username for 'https://github.com': [логин] → ты правильно указал логин.
  • Password for 'https://[логин]@github.com': → GitHub ждёт токен, а не пароль.
  • remote: Permission denied → значит, авторизация не прошла. Рассмотрим варианты решения ниже.

Как исправить

Подключи новый тип аутентификации в GitHub:

  • токен (Personal Access Token созданный в кабинете GitHub);
  • SSH ключ (созданный локально и зарегистрированный в кабинете GitHub);

Создание и подключение токена (Personal Access Token).

📖 Документация GitHub: "Managing your personal access tokens" - Открыть

### Сгенерируй токен в GitHub:

  • Зайди в Settings → Developer settings → Personal access tokens → Tokens (classic) - Открыть
  • Создай новый токен, поставь галочки параметров доступа repo (и, если нужно, workflow для CI/CD).
  • Выбери время жизни токена.

### При пуше (git push / git pull) каждый раз вводи:

  • Логин: [логин]
  • Пароль: вместо пароля вставляй токен.

### Можно сохранить токен навсегда:

git config --global credential.helper store

И при следующем вводе Git сохранит данные в ~/.git-credentials.

Подключение SSH ключа

  1. Если уже есть SSH ключ, то рекомендую проверить, что он актуального безопасного типа (см. ниже).
  2. Если у тебя еще нет SSH ключа, то создай ключ ed25519 по инструкции ниже.
  3. После этого добавь открытый ключ в свою учётную запись на GitHub, чтобы включить аутентификацию для операций с Git по SSH (см. ниже).

Каждый пункт и возможные ошибки рассмотрены ниже.

Проверка наличия существующих ключей SSH

Перед созданием нового ключа SSH необходимо проверить наличие существующих ключей на локальном компьютере.

ℹ️ GitHub улучшил безопасность, убрав старые небезопасные типы ключей 15 марта 2022 года. По состоянию на эту дату ключи DSA (ssh-dss) больше не поддерживаются. Невозможно добавить новые ключи DSA в личная учетная запись на GitHub. Ключи RSA (ssh-rsa) с valid_after до 2 ноября 2021 г. могут продолжать использовать любой алгоритм подписи. Ключи RSA, созданные после этой даты, должны использовать алгоритм подписи SHA-2. Для использования сигнатур SHA-2 может потребоваться обновить некоторые старые клиенты.

Введите в терминале ls -al ~/.ssh, чтобы узнать, имеются ли существующие ключи SSH.

$ ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist

Проверьте список файлов каталога, чтобы узнать, есть ли у вас открытый ключ SSH. По умолчанию имена файлов поддерживаемых открытых ключей для GitHub являются одним из следующих.

  • id_rsa.pub
  • id_ecdsa.pub
  • id_ed25519.pub.

Генерация нового ключа SSH

📖 Документация GitHub: "Generating a new SSH key" - Открыть.

Новый SSH-ключ генерим на локальном компьютере.

В терминале вставь команду ниже, заменив адрес электронной почты, использованный в примере, на свой адрес электронной почты GitHub.

ssh-keygen -t ed25519 -C "your_email@example.com"

где

  • -t ed25519 — указывает тип ключа (Ed25519).
  • -C "your_email@example.com" — комментарий, который будет записан в .pub файл (обычно туда ставят email или описание, чтобы различать ключи).

Далее терминале появится вопрос куда сохранять ключ и как назвать файлы с ключом. Если ты меняешь название файла, но не укажешь полный путь, то файлы ключей создадутся в папке выбранной в терминале.

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/[user]/.ssh/id_ed25519):

Пример ввода ответа:

/home/[user]/.ssh/id_ed25519_github

Дальше тебе нужно придумать пароль к ключу и повторить его

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

В результате создаются два файла с ключами: публичный и секретный.

Your identification has been saved in id_ed25519_github
Your public key has been saved in id_ed25519_github.pub

В кабинете GitHub нужно вводить данные публичной части ключа из файла с расширением .pub

Добавь SSH ключ в агент в терминале локально чтобы при аутентификации система находила его:

ssh-add ~/.ssh/id_ed25519_github

Добавление SSH ключа в GitHub

В личном кабинете GitHubключ добавляется по пути GitHub → Settings → SSH and GPG keys - Открыть

  • Добавь публичный ключ - содержимое файла с расширением .pub
  • Измени метод аутентификации в проекте. Скопируй на GitHub ссылку SSH-адреса твоего репозитория и выполни команду в терминале локально находясь в папке проекта:
git remote set-url origin [ssh ссылка репозитория]

Теперь можешь пушь без пароля.

Ошибка WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

- ты получил типичное SSH-сообщение безопасности.

Почему это происходит?

  1. Ты впервые подключаешься к серверу после того, как GitHub обновил свои хост-ключи.
  2. Или в ~/.ssh/known_hosts уже сохранён старый ключ для github.com.
  3. В худшем случае — действительно "man-in-the-middle" атака (когда кто-то подменяет сервер). Но если речь о GitHub и ты уверен в адресе — это почти точно обновление ключей.

Как исправить

Эта команда удалит старую запись о github.com из файла known_hosts.

В пути замени [user]:

ssh-keygen -f "/home/[user]/.ssh/known_hosts" -R "github.com"

После этого при следующей попытке git pull или git push SSH спросит:

The authenticity of host 'github.com (IP-адрес)' can't be established.
RSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no)?

Нужно набрать yes, и новый ключ будет добавлен в known_hosts.

Резюме

Тебе нужно либо перейти на Personal Access Token (через HTTPS), либо на SSH.
Оба способа рабочие, но SSH обычно удобнее, если работаешь много с GitHub.