SSH-ключ
Что такое SSH-ключи, какие они бывают и как настроить их на Mac, Linux или Windows. Подробное руководство с примерами команд.
Когда вы выполняете push или pull с удалённого репозитория по SSH (например, по URL вида [email protected]:...), Git должен подтвердить вашу личность без ввода пароля каждый раз. SSH-ключи решают эту задачу. В этой главе объясняется, что такое SSH-ключ, как работает пара ключей и как создать ключ и зарегистрировать его на удалённом сервере в macOS, Linux и Windows.
Что такое SSH-ключи?

SSH-ключ — это учётная запись доступа, используемая в протоколе SSH (Secure Shell). SSH — сетевой протокол, позволяющий безопасно входить с одного компьютера на другой и управлять серверами, операционными системами и конфигурациями через зашифрованное соединение. По функции SSH-ключи выполняют ту же роль, что и пароль, но значительно безопаснее: ключ никогда не передаётся по сети, а вычислить закрытый ключ по открытому практически невозможно.
SSH-ключи всегда создаются парами, и каждая пара состоит из открытого ключа и закрытого ключа:
- Открытый ключ (также называемый authorized key). Вы свободно распространяете его и добавляете на каждую систему, к которой хотите получить доступ. Он определяет, кому разрешён вход.
- Закрытый ключ (также называемый identity key). Он хранится в тайне на вашей машине и никогда не должен передаваться кому-либо. Он подтверждает вашу личность на любом сервере, на котором есть соответствующий открытый ключ.
Оба ключа математически связаны между собой. Сервер шифрует запрос вашим открытым ключом; ответить на него может только владелец соответствующего закрытого ключа. Именно так происходит аутентификация без передачи секрета по сети.
Never share, email, or commit your private key (~/.ssh/id_ed25519). Only the file ending in .pub is meant to be copied to servers and Git hosting providers.
Зачем использовать SSH-ключи с Git
- Нет пароля при каждом push. После регистрации ключа
git push,git pullиgit fetchпо SSH выполняются без запроса пароля. - Надёжнее паролей. Ключи нельзя угадать или подобрать перебором, как короткий пароль.
- Требование многих хостингов. GitHub больше не принимает пароли учётной записи для операций Git; SSH-ключи (или токены) стали стандартом.
Чтобы клонировать репозиторий по SSH после настройки ключа, используйте URL в формате git@. Подробнее об адресации удалённых репозиториев см. в разделах Git Clone и Git Remote.
Как настроить SSH-ключи?
Для создания SSH-ключей используется инструмент генерации ключей — почти всегда ssh-keygen, входящий в состав клиента OpenSSH. Он применяет алгоритмы криптографии с открытым ключом; наиболее распространены Ed25519 (современный, компактный, быстрый, рекомендуется) и RSA. Более старые алгоритмы, такие как DSA, существуют, но считаются слабыми и отключены по умолчанию в актуальных версиях OpenSSH.
Флаг -t выбирает алгоритм. Два распространённых варианта:
# Recommended: Ed25519
ssh-keygen -t ed25519 -C "[email protected]"
# Compatibility fallback: RSA with a 4096-bit key
ssh-keygen -t rsa -b 4096 -C "[email protected]"Флаг -C добавляет комментарий (обычно ваш email), чтобы ключ было легко опознать в списке авторизованных ключей.
Создание SSH-ключа на Mac и Linux
Обе операционные системы поставляются с современным терминалом и пакетом OpenSSH, поэтому шаги идентичны.
- Откройте терминал и выполните команду:
Генерация пары ключей
ssh-keygen -t ed25519 -C "[email protected]"- Выберите место сохранения ключа. Нажмите Enter, чтобы принять путь по умолчанию (
~/.ssh/id_ed25519):
Выбор расположения файла
> Enter a file in which to save the key (~/.ssh/id_ed25519): [Press enter]При этом будут созданы два файла: закрытый ключ id_ed25519 и открытый ключ id_ed25519.pub.
- Задайте кодовую фразу. Она шифрует закрытый ключ на диске, поэтому даже украденный файл ключа бесполезен без неё. Вас попросят ввести её при первом использовании ключа в сессии:
Установка кодовой фразы
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]- Добавьте новый SSH-ключ в ssh-agent. ssh-agent хранит расшифрованные закрытые ключи в памяти и подписывает запросы аутентификации от вашего имени, поэтому вы вводите кодовую фразу только один раз за сессию.
Выполните следующую команду, чтобы убедиться, что ssh-agent запущен:
SSH-ключ на Linux
eval "$(ssh-agent -s)"
> Agent pid 59566Если ssh-agent запущен, добавьте новый SSH-ключ в локальный SSH-агент, выполнив следующую команду:
SSH-ключ
ssh-add ~/.ssh/id_ed25519(Note: On modern macOS (OpenSSH 8.8+), ssh-add -K is deprecated. Instead, add AddKeysToAgent yes to your ~/.ssh/config file to automatically persist keys in the keychain.)
- Скопируйте открытый ключ на удалённый сервер.
Чтобы использовать ключ для аутентификации, необходимо добавить его в файл
~/.ssh/authorized_keysудалённого сервера. Выполните следующую команду со своей локальной машины:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host- Проверьте соединение. Убедитесь, что вы можете войти на удалённый сервер с помощью нового ключа:
ssh user@remote_hostСоздание SSH-ключа в Windows
Для создания SSH-ключа в операционной системе Windows вам понадобится Git Bash. Откройте Git Bash и выполните следующую команду для генерации ключа:
ssh-keygen -t ed25519 -C "[email protected]"Следуйте тем же подсказкам, что описаны выше, чтобы задать расположение файла и кодовую фразу. После генерации ключа скопируйте его на удалённый сервер или в сервис Git-хостинга с помощью команды ssh-copy-id или вставив содержимое id_ed25519.pub в настройки SSH-ключей сервиса.
Добавление ключа в GitHub, GitLab или Bitbucket
Git-хостинг — это не SSH-сервер, которым вы управляете, поэтому ssh-copy-id здесь не применяется: открытый ключ нужно вставить через веб-интерфейс. Выведите открытый ключ и скопируйте его:
cat ~/.ssh/id_ed25519.pubВывод представляет собой одну строку, начинающуюся с ssh-ed25519 и заканчивающуюся заданным вами комментарием:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... [email protected]Скопируйте всю строку и добавьте её в настройки SSH-ключей вашей учётной записи (на GitHub: Settings → SSH and GPG keys → New SSH key). Затем проверьте соединение:
ssh -T [email protected]При первом успешном подключении вас попросят подтвердить отпечаток хоста, после чего сервер поприветствует вас по имени пользователя — оболочка при этом не открывается, что ожидаемо для GitHub.
После регистрации ключа переключите удалённый репозиторий на SSH URL, чтобы push использовал его:
git remote set-url origin [email protected]:user/repo.gitОб управлении URL удалённых репозиториев см. Git Remote, об отправке коммитов — Git Push.
Частые проблемы и советы
Permission denied (publickey)обычно означает, что у хоста нет соответствующего открытого ключа или агент не содержит вашего закрытого ключа. Выполнитеssh-add -l, чтобы вывести список загруженных ключей, и при необходимости добавьте свой заново.- Используйте один ключ для нескольких хостов. Одна пара ключей может аутентифицировать вас на множестве серверов; создавать новый ключ для каждого проекта не нужно. Отдельный ключ создаётся только тогда, когда вы хотите изолировать доступ.
- Делайте резервные копии ключей, а не только репозиториев. Потеря
~/.ssh/id_ed25519означает необходимость заново генерировать ключ и регистрировать его везде. - SSH-ключи аутентифицируют соединения; если вы также хотите подтвердить авторство коммита, это отдельный механизм — см. Signing Commits. Для первоначальной настройки см. Install Git и Git Config.