Коротко: SSH-ключ создаётся одной командой ssh-keygen -t ed25519 -C "you@example.com" в Linux, macOS и в PowerShell на Windows. Она кладёт в ~/.ssh/ пару ключей: закрытый, который остаётся у вас, и файл .pub, который вы копируете на каждый сервер. Нажмите Enter, чтобы принять путь по умолчанию, и задайте парольную фразу, когда команда спросит. Ниже разобрано, зачем нужна фраза, как скопировать ключ на сервер и как настроить SSH-авторизацию по ключу вместо пароля.
Как создать SSH-ключ
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
| ed25519 | RSA | |
|---|---|---|
| Размер ключа | Фиксированный, открытый ключ около 68 байт | Переменный; рекомендуется 4096 бит |
| Скорость | Быстрее создаётся и проверяется | При 4096 битах заметно медленнее |
| Поддержка | OpenSSH 6.5 (2014) и новее, то есть на любой актуальной системе | Везде, включая очень старые серверы |
| Рекомендация | Выбор по умолчанию сегодня | Только если сервер слишком стар для ed25519 |
ssh-keygen -t rsa -b 4096 -C "you@example.com"Зачем задавать парольную фразу
Парольная фраза шифрует сам файл закрытого ключа. Без неё любой, кто скопирует ~/.ssh/id_ed25519 с вашего диска (украденный ноутбук, утёкший бэкап, вредонос, читающий домашний каталог), сразу сможет войти на каждый сервер, который доверяет этому ключу, и никакой парольной фразы ему знать не нужно. Если фраза задана, без неё этот файл бесполезен.
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.10ssh-copy-id один раз входит на сервер текущим способом (по паролю или уже настроенному ключу) и дописывает ваш открытый ключ в ~/.ssh/authorized_keys на сервере. Каталог .ssh и файл, которые он создаёт сам, получают права 700 и 600, потому что он выполняет umask 077. Права уже существующих каталога и файла он в обычном режиме (без -s) не исправляет, поэтому их стоит проверить, как показано в следующем разделе.
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-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx you@laptopchmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keyssshd отказывается доверять 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 от имени администратора, после чего добавьте ключ:
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 (англ.).
Как отключить вход по паролю, когда ключ работает
Прежде чем трогать эту настройку, убедитесь, что вход по ключу работает, во второй, отдельной сессии. Отключить вход по паролю, когда единственная рабочая сессия — та самая, которую это затронет, — верный способ закрыть себе доступ:
PasswordAuthentication nosudo 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, закрытый ключ остаётся у вас.