Руководства

SSH-ключ: как создать его командой ssh-keygen и настроить авторизацию по ключу

Как создать SSH-ключ командой ssh-keygen -t ed25519 в Linux, macOS и Windows, скопировать его на сервер и настроить SSH-авторизацию по ключу вместо пароля.

Опубликовано ~9 мин чтения
На этой странице

Коротко: SSH-ключ создаётся одной командой ssh-keygen -t ed25519 -C "you@example.com" в Linux, macOS и в PowerShell на Windows. Она кладёт в ~/.ssh/ пару ключей: закрытый, который остаётся у вас, и файл .pub, который вы копируете на каждый сервер. Нажмите Enter, чтобы принять путь по умолчанию, и задайте парольную фразу, когда команда спросит. Ниже разобрано, зачем нужна фраза, как скопировать ключ на сервер и как настроить SSH-авторизацию по ключу вместо пароля.

Как создать SSH-ключ

Linux · macOS · Windows (PowerShell, клиент OpenSSH встроен начиная с Windows 10)
ssh-keygen -t ed25519 -C "you@example.com"

# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/you/.ssh/id_ed25519):
# Enter passphrase (empty for no passphrase):
# Enter same passphrase again:
# Your identification has been saved in /home/you/.ssh/id_ed25519
# Your public key has been saved in /home/you/.ssh/id_ed25519.pub

-C задаёт комментарий, который хранится внутри открытого ключа (обычно это адрес почты или метка вроде имени компьютера). Нужен он только для того, чтобы потом отличать ключи друг от друга в файле authorized_keys на сервере. На безопасность он не влияет.

В Windows ключи по умолчанию ложатся в C:\Users\ИМЯ\.ssh\ (в PowerShell это $env:USERPROFILE\.ssh): id_ed25519 и id_ed25519.pub. Что в Windows устроено иначе, разобрано в разделе о Windows ниже.

Какой тип ключа выбрать: ed25519 или RSA

ed25519RSA
Размер ключаФиксированный, открытый ключ около 68 байтПеременный; рекомендуется 4096 бит
СкоростьБыстрее создаётся и проверяетсяПри 4096 битах заметно медленнее
ПоддержкаOpenSSH 6.5 (2014) и новее, то есть на любой актуальной системеВезде, включая очень старые серверы
РекомендацияВыбор по умолчанию сегодняТолько если сервер слишком стар для ed25519
Если сервер настолько стар, что нужен RSA
ssh-keygen -t rsa -b 4096 -C "you@example.com"

Зачем задавать парольную фразу

Парольная фраза шифрует сам файл закрытого ключа. Без неё любой, кто скопирует ~/.ssh/id_ed25519 с вашего диска (украденный ноутбук, утёкший бэкап, вредонос, читающий домашний каталог), сразу сможет войти на каждый сервер, который доверяет этому ключу, и никакой парольной фразы ему знать не нужно. Если фраза задана, без неё этот файл бесполезен.

ssh-agent: парольная фраза один раз за сеанс, а не при каждом подключении
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l   # проверить, что ключ загружен

В macOS команда ssh-add --apple-use-keychain ~/.ssh/id_ed25519 сохраняет парольную фразу в связке ключей «вход» (login keychain), и ключ подгружается автоматически в каждом новом сеансе, а не только в текущем.

Как скопировать открытый ключ на сервер

Проще всего
ssh-copy-id user@203.0.113.10

ssh-copy-id один раз входит на сервер текущим способом (по паролю или уже настроенному ключу) и дописывает ваш открытый ключ в ~/.ssh/authorized_keys на сервере. Каталог .ssh и файл, которые он создаёт сам, получают права 700 и 600, потому что он выполняет umask 077. Права уже существующих каталога и файла он в обычном режиме (без -s) не исправляет, поэтому их стоит проверить, как показано в следующем разделе.

Без ssh-copy-id (например, в Windows или на минимальном образе сервера)
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@203.0.113.10 "umask 077; mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Каким должен быть файл authorized_keys

~/.ssh/authorized_keys, по одному открытому ключу на строку
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx you@laptop
Права, которых требует sshd
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

sshd отказывается доверять authorized_keys, если сам файл или каталог .ssh доступен на запись группе или всем; то же проверяется и для домашнего каталога. Неправильные права здесь — одна из самых частых причин, по которой вход по ключу молча откатывается к запросу пароля.

Подключение по ключу

Когда открытый ключ уже на сервере
ssh -i ~/.ssh/id_ed25519 user@203.0.113.10
# Если ключ лежит в стандартном месте под стандартным именем, -i не нужен:
ssh user@203.0.113.10

Чтобы не набирать каждый раз -i и имя пользователя для сервера с нестандартным ключом, пропишите их в конфиге SSH (англ.).

SSH-ключ в Windows: PowerShell и ssh-agent

В Windows 10 и 11 клиент OpenSSH уже встроен, поэтому ключ создаётся той же командой ssh-keygen -t ed25519 в PowerShell, а подключение идёт обычной командой ssh. Два отличия от Linux. Во-первых, eval "$(ssh-agent -s)" в PowerShell не работает: ssh-agent в Windows — это служба, и по документации Microsoft она по умолчанию отключена. Включите её один раз в PowerShell от имени администратора, после чего добавьте ключ:

PowerShell (от имени администратора)
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Во-вторых, в Windows нет ssh-copy-id, поэтому открытый ключ на сервер передают командой type … | ssh из раздела о копировании выше.

Windows и PuTTY

PuTTY (англ.) не читает формат ключей OpenSSH напрямую, поэтому создайте ключ в PuTTYgen (или загрузите в PuTTYgen уже существующий файл id_ed25519 через Conversions → Import key), сохраните файл .ppk и укажите его в PuTTY в разделе Connection → SSH → Auth → Credentials. Pageant, который ставится вместе с PuTTY, играет ту же роль, что и ssh-agent: загрузите в него ключ один раз за сеанс, и не придётся разблокировать его при каждом подключении.

Полная инструкция для Windows, включая встроенный клиент OpenSSH как альтернативу PuTTY, — в статье SSH в Windows (англ.).

Как отключить вход по паролю, когда ключ работает

Прежде чем трогать эту настройку, убедитесь, что вход по ключу работает, во второй, отдельной сессии. Отключить вход по паролю, когда единственная рабочая сессия — та самая, которую это затронет, — верный способ закрыть себе доступ:

/etc/ssh/sshd_config
PasswordAuthentication no
sudo systemctl restart ssh    # Debian, Ubuntu; в Rocky Linux и AlmaLinux: sudo systemctl restart sshd

В Debian 12 и Ubuntu основной sshd_config в самом начале подключает файлы из /etc/ssh/sshd_config.d/, а sshd берёт первое встреченное значение каждого параметра. Если в одном из этих файлов стоит PasswordAuthentication yes (так бывает в облачных образах Ubuntu, в файле 50-cloud-init.conf), ваша строка ниже по основному файлу ничего не изменит. Итоговое значение покажет sudo sshd -T | grep -i passwordauthentication.

Это лишь один шаг в общей настройке безопасности. Вся последовательность, в порядке, при котором невозможно потерять доступ, описана в статье Как защитить доступ по SSH.

Ключ скопирован, а сервер всё равно спрашивает пароль или сразу отказывает? Пройдитесь по чек-листу в статье Permission denied (publickey): почти всегда дело в правах или в неверном пути.

Частые вопросы

Как создать SSH-ключ?

Выполните ssh-keygen -t ed25519 -C "you@example.com", нажмите Enter, чтобы принять путь по умолчанию, и задайте парольную фразу. Команда создаёт в ~/.ssh/ закрытый ключ и парный ему файл .pub. В Windows 10 и 11 та же команда работает в PowerShell, а ключи ложатся в C:\Users\ИМЯ\.ssh\.

Что выбрать: ed25519 или RSA?

ed25519 для всего актуального: такой ключ быстрее создаётся и проверяется и поддерживается начиная с OpenSSH 6.5 (2014). RSA с -b 4096 нужен, только если приходится подключаться к серверу, слишком старому для ed25519.

Как скопировать SSH-ключ на сервер?

Команда ssh-copy-id user@host делает это за один шаг: дописывает открытый ключ в ~/.ssh/authorized_keys на сервере, а каталог и файл, если их ещё нет, создаёт с правами 700 и 600. В Windows, где ssh-copy-id нет, передайте файл .pub через ssh в authorized_keys вручную. Копируйте только .pub, закрытый ключ остаётся у вас.

Читайте также

Все статьи раздела

ssh-copy-id: как скопировать SSH-ключ на сервер и что делать в Windows

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host дописывает открытый SSH-ключ в authorized_keys. Как создать ключ, все параметры, замена для Windows и ошибки.

Что такое SSH и как защитить подключение к серверу

SSH — протокол для защищённого удалённого доступа к серверу. Как подключиться по SSH и настроить вход только по ключу, fail2ban и файрвол за один проход.

Как добавить пользователя в группу в Linux: usermod -aG, gpasswd и adduser

Как добавить пользователя в группу в Linux: sudo usermod -aG ГРУППА ПОЛЬЗОВАТЕЛЬ и новый вход. Почему важен -a, gpasswd, adduser и как создать пользователя.

SSH on Windows 10 and 11: the built-in OpenSSH client, keys, PuTTY and WinSCP(англ.)

Windows 10 and 11 include an OpenSSH client: open PowerShell and run ssh user@host. Install it, set up keys, ssh-agent and the config file, or use PuTTY.

How to create a new branch in Git: git switch -c, git checkout -b and git push -u(англ.)

How to create a new branch in Git with git switch -c or checkout -b, from a tag or remote branch, push it with -u, delete it, and install Git on Ubuntu.