W3docs

SSH-ключ

Что такое SSH-ключи, какие они бывают и как настроить их на Mac, Linux или Windows. Подробное руководство с примерами команд.

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

Что такое SSH-ключи?

SSH-ключ

SSH-ключ — это учётная запись доступа, используемая в протоколе SSH (Secure Shell). SSH — сетевой протокол, позволяющий безопасно входить с одного компьютера на другой и управлять серверами, операционными системами и конфигурациями через зашифрованное соединение. По функции SSH-ключи выполняют ту же роль, что и пароль, но значительно безопаснее: ключ никогда не передаётся по сети, а вычислить закрытый ключ по открытому практически невозможно.

SSH-ключи всегда создаются парами, и каждая пара состоит из открытого ключа и закрытого ключа:

  1. Открытый ключ (также называемый authorized key). Вы свободно распространяете его и добавляете на каждую систему, к которой хотите получить доступ. Он определяет, кому разрешён вход.
  2. Закрытый ключ (также называемый 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, поэтому шаги идентичны.

  1. Откройте терминал и выполните команду:

Генерация пары ключей

ssh-keygen -t ed25519 -C "[email protected]"
  1. Выберите место сохранения ключа. Нажмите Enter, чтобы принять путь по умолчанию (~/.ssh/id_ed25519):

Выбор расположения файла

> Enter a file in which to save the key (~/.ssh/id_ed25519): [Press enter]

При этом будут созданы два файла: закрытый ключ id_ed25519 и открытый ключ id_ed25519.pub.

  1. Задайте кодовую фразу. Она шифрует закрытый ключ на диске, поэтому даже украденный файл ключа бесполезен без неё. Вас попросят ввести её при первом использовании ключа в сессии:

Установка кодовой фразы

> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
  1. Добавьте новый 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.)

  1. Скопируйте открытый ключ на удалённый сервер. Чтобы использовать ключ для аутентификации, необходимо добавить его в файл ~/.ssh/authorized_keys удалённого сервера. Выполните следующую команду со своей локальной машины:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host
  1. Проверьте соединение. Убедитесь, что вы можете войти на удалённый сервер с помощью нового ключа:
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.

Практика

Практика
Какие аспекты SSH-ключей важны в контексте Git?
Какие аспекты SSH-ключей важны в контексте Git?
Was this page helpful?