SSH-ключ складається з двох файлів: приватний лишається тільки на вашому комп’ютері, а публічний дописують у ~/.ssh/authorized_keys на сервері або додають через панель хостингу. Створіть ключ командою ssh-keygen -t ed25519, перенесіть публічну частину командою ssh-copy-id, перевірте вхід у новому вікні і лише потім вимикайте вхід за паролем. Після цього обов’язково подивіться ефективні налаштування командою sshd -T: на нашому стенді файл 50-cloud-init.conf тихо залишав паролі увімкненими, хоча перевірка синтаксису проходила без зауважень.
Як ми перевіряли
10 листопада 2026 року на тестовому стенді: контейнер Ubuntu 24.04.5, 2 vCPU Intel Xeon 2,1 ГГц, OpenSSH 9.6p1 з пакетів Ubuntu, OpenSSL 3.0.13, puttygen і plink 0.81. Окремий екземпляр sshd з типовими для Ubuntu налаштуваннями слухав локальний порт, клієнт і сервер працювали від різних користувачів. Ми згенерували ключі шести типів, заміряли генерацію, підпис і повний вхід, по черзі ламали права на файли, конфігурацію sshd і клієнта та записували реальні повідомлення з логів. Апаратного FIDO2-ключа на стенді не було. Це поведінка тестового сервера, а не дані з серверів RichHost.
Коротко: п’ять команд від нуля до входу за ключем
На своєму комп’ютері (Linux, macOS або PowerShell у Windows 10 і 11, де клієнт OpenSSH уже вбудований):
ssh-keygen -t ed25519 -C "laptop-2026" ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server ssh -i ~/.ssh/id_ed25519 user@server
Друга команда один раз попросить пароль від сервера і відповість рядком Number of key(s) added: 1. На стенді вона сама створила каталог ~/.ssh з правами 700 і файл authorized_keys з правами 600. Якщо ви ще не підключалися до сервера по SSH, почніть з інструкції як підключитися по SSH з Windows, macOS і Linux.
Ed25519, RSA чи ECDSA: що показав замір
Ми згенерували ключі всіх поширених типів і для кожного 15 разів виконали повний вхід на сервер. Результати:
| Тип | Генерація, медіана | Приватний ключ | Файл .pub | Підписів за секунду (openssl speed) | Вхід по SSH, медіана |
|---|---|---|---|---|---|
| Ed25519 | 6 мс | 399 байт | 91 байт | 21 850 | 211 мс |
| ECDSA P-256 | 10 мс | 505 байт | 171 байт | 37 246 | 215 мс |
| RSA 3072 | 679 мс | 2590 байт | 563 байти | 962 | 210 мс |
| RSA 4096 | 1599 мс | 3369 байт | 735 байт | 464 | 217 мс |
Висновок несподівано простий: на швидкість входу тип ключа не впливає, різниця в межах похибки. Час з’єднання визначає обмін ключами і запуск сесії, а не одна операція підпису. Відрізняються розмір і зручність: публічний ключ Ed25519 займає один короткий рядок, який легко вставити в панель або повідомлення, а RSA 4096 тягнеться на 700 символів і частіше ламається під час копіювання. Генерація RSA випадкова за тривалістю: десять запусків RSA 4096 тривали від 0,7 до 3,2 секунди.

Практичне правило:
- Ed25519 для всіх нових ключів. Від OpenSSH 9.5 саме його створює
ssh-keygenбез параметра-t, ми перевірили це на версії 9.6. - RSA 3072 або 4096 лише тоді, коли сервер чи обладнання не розуміє Ed25519: дуже старий OpenSSH, деякі мережеві пристрої, застарілі бібліотеки.
- ECDSA працює, але переваг перед Ed25519 для звичайного входу не дає.
- Ключі FIDO2 (
ed25519-sk) зберігають секрет в апаратному токені і вимагають дотику до нього. Без пристрою командаssh-keygen -t ed25519-skна стенді завершилась повідомленнямKey enrollment failed: device not found.
Пароль до ключа і ssh-agent
Passphrase шифрує приватний ключ на диску: якщо файл украдуть разом із ноутбуком, без фрази він марний. Параметр -a задає кількість раундів KDF, тобто наскільки дорого перебирати фразу. Ми заміряли розшифрування ключа:
-a 16(типово): 148 мс;-a 100: 1,0 с;-a 200: 2,0 с.
Секунда на розблокування майже непомітна, якщо ключ розшифровує агент один раз за робочий день:
ssh-keygen -t ed25519 -a 100 -C "work-laptop" eval "$(ssh-agent -s)" ssh-add -t 8h ~/.ssh/id_ed25519 ssh-add -l
Після ssh-add три входи поспіль пройшли без жодного запиту. Без агента ключ з паролем не працює в неінтерактивному режимі: скрипт отримав Permission denied (publickey,password). У Windows агент є службою, яку вмикають один раз у PowerShell від імені адміністратора: Get-Service ssh-agent | Set-Service -StartupType Automatic, потім Start-Service ssh-agent і ssh-add.
Як додати ключ на сервер, у панель хостингу і в PuTTY
Якщо ssh-copy-id недоступна (у Windows її немає), допишіть ключ вручну, увійшовши за паролем:
mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "ssh-ed25519 AAAA... laptop-2026" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
Один ключ займає рівно один рядок. Коли ми розбили рядок навпіл, як буває під час копіювання з вузького вікна, сервер мовчки відмовив, а в лозі з’явилось лише Failed publickey. Перевірити файл можна командою ssh-keygen -lf ~/.ssh/authorized_keys: для кожного правильного рядка вона покаже відбиток. Закінчення рядків у стилі Windows (CRLF) sshd 9.6 приймав без проблем.
Панель хостингу. У панелі керування ключ зазвичай додають у налаштуваннях користувача або в розділі SSH: туди вставляють рядок із файлу .pub, і панель дописує його в authorized_keys вашого користувача. Вхід по SSH працює лише тоді, коли для користувача дозволено оболонку, а не nologin. На віртуальному хостингу це вирішує провайдер: у RichHost SSH-доступ є на всіх тарифах.
PuTTY і FileZilla. PuTTY працює з власним форматом .ppk. Перетворення ми перевірили в puttygen 0.81:
puttygen ~/.ssh/id_ed25519 -o key.ppk puttygen key.ppk -O public-openssh puttygen key.ppk -O private-openssh -o id_from_ppk
Файл отримав заголовок PuTTY-User-Key-File-3, plink з ним увійшов на сервер, а відбиток збігся з оригінальним ключем. Навпаки не вийде: OpenSSH, отримавши .ppk, відповів Load key "key.ppk": error in libcrypto. Той самий ключ можна використати для SFTP; як підключити його в клієнті, описано в інструкції як підключитися через FileZilla.
Файл ~/.ssh/config і помилка Too many authentication failures
Щоб не писати щоразу порт, ім’я і шлях до ключа, створіть запис у ~/.ssh/config:
Host myserver
HostName 203.0.113.10
Port 22
User deploy
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Тепер достатньо ssh myserver, а ssh -G myserver покаже, які значення реально застосовано. Рядок IdentitiesOnly yes важливий: ми поклали в агент шість сторонніх ключів і підключилися з правильним ключем через -i. Клієнт спершу перебрав ключі агента, сервер з типовим MaxAuthTries 6 розірвав з’єднання з повідомленням Too many authentication failures. З IdentitiesOnly yes вхід пройшов одразу. Сам файл config теж має бути закритим: з правами 666 клієнт відмовився працювати (Bad owner or permissions).
Права на файли: що sshd вважає «bad ownership or modes»
Параметр StrictModes yes (типове значення) змушує sshd ігнорувати ключ, якщо файли можуть змінити інші користувачі. Клієнт при цьому бачить лише Permission denied (publickey), а причина є тільки в лозі сервера. Що ми отримали:
| Стан на сервері | Результат |
|---|---|
authorized_keys 600 або 644 |
вхід працює |
authorized_keys 666 |
Authentication refused: bad ownership or modes for file |
authorized_keys належить іншому користувачу |
те саме повідомлення |
~/.ssh 755 |
вхід працює |
~/.ssh 777 або домашній каталог 777 |
bad ownership or modes for directory |
~/.ssh належить root |
Could not open user ... authorized keys: Permission denied |
Цікава деталь Ubuntu і Debian: права 664 на authorized_keys і 775 на домашній каталог sshd пропустив, бо групою був особистий груповий запис самого користувача. Щойно файл переписали на чужу групу з тими ж правами 664, вхід заблокувався. Найпростіше правило: каталог ~/.ssh 700, файли в ньому 600, власник ви. На клієнті ще суворіше: приватний ключ з правами 644 клієнт ігнорує з попередженням UNPROTECTED PRIVATE KEY FILE. Як працюють ці цифри, пояснює стаття про права доступу до файлів на хостингу.
Вимикаємо вхід за паролем і перевіряємо sshd -T
Тримайте відкритою поточну сесію, поки не переконаєтесь, що вхід за ключем працює в новому вікні. Налаштування краще винести в окремий файл, назва якого стоїть раніше за інші за абеткою:
# /etc/ssh/sshd_config.d/01-hardening.conf PasswordAuthentication no KbdInteractiveAuthentication no PermitRootLogin no
sudo sshd -t sudo sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin) ' sudo systemctl reload ssh
Сервіс в Ubuntu і Debian називається ssh, у RHEL-подібних системах sshd. Чому саме окремий файл з префіксом 01: sshd бере перше знайдене значення параметра, а рядок Include стоїть на початку основного конфігу. На стенді ми відтворили три пастки:
- Файл
50-cloud-init.confзPasswordAuthentication yes(його створює cloud-init на багатьох хмарних образах) і наш файл99-hardening.conf:sshd -tбез помилок,sshd -Tпоказавpasswordauthentication yes, вхід за паролем пройшов. - Рядок
PasswordAuthentication noдописано в кінець основногоsshd_config, як радять багато старих інструкцій: результат той самий, паролі працюють. PasswordAuthentication no, алеKbdInteractiveAuthentication yesіUsePAM yes: метод password сервер відхилив, а через keyboard-interactive той самий пароль прийняв, у лозіAccepted keyboard-interactive/pam.
Файл 01-hardening.conf виправив усі три випадки. Якщо в конфігурації є блоки Match, перевіряйте конкретне підключення: у нас sshd -T показував no, а sshd -T -C user=deploy,host=x,addr=127.0.0.1 показав yes для адреси з блоку Match Address. Повний чекліст першого налаштування сервера є в матеріалі налаштування VPS Ubuntu 24.04, а про те, навіщо все це робити, розповідає стаття про атаки підбору паролів.
Помилки SSH-ключів: причина і виправлення
| Помилка | Причина | Виправлення |
|---|---|---|
Permission denied (publickey) |
Ключа немає в authorized_keys потрібного користувача, рядок зламано або sshd ігнорує файл через права |
Перевірити лог сервера, ssh-keygen -lf ~/.ssh/authorized_keys, ім’я користувача |
bad ownership or modes for file / directory |
Файл або каталог доступний для запису іншим | chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys, власник ви |
UNPROTECTED PRIVATE KEY FILE |
Приватний ключ читають інші | chmod 600 ~/.ssh/id_ed25519 |
Too many authentication failures |
Агент пропонує забагато ключів | IdentitiesOnly yes і IdentityFile у config |
Load key ...: error in libcrypto |
OpenSSH отримав файл .ppk | puttygen key.ppk -O private-openssh -o id_key |
incorrect passphrase supplied |
Неправильна фраза до ключа | Ввести правильну; забуту фразу не відновити, створіть новий ключ |
REMOTE HOST IDENTIFICATION HAS CHANGED |
Змінився ключ сервера: перевстановлення або підміна | Звірити відбиток з провайдером, потім ssh-keygen -R host |
Пароль приймається після PasswordAuthentication no |
Інший файл задав значення раніше або ввімкнено keyboard-interactive | Файл 01-hardening.conf, перевірка sshd -T |
Key enrollment failed: device not found |
Ключ типу -sk без підключеного FIDO2-токена |
Підключити токен або обрати Ed25519 |
Що робити у вашій ситуації
| Якщо | Робіть |
|---|---|
| Створюєте ключ уперше | Ed25519 з passphrase і -a 100, ssh-agent на час роботи |
| Сервер або пристрій не приймає Ed25519 | RSA 3072 або 4096, окремий ключ саме для нього |
| Працюєте з кількох комп’ютерів | Окремий ключ на кожен пристрій, зрозумілий коментар -C, щоб відкликати один рядок |
| У вас VPS після першого запуску | Ключ, перевірка входу, файл 01-hardening.conf, sshd -T, і лише потім закрити стару сесію |
| У вас віртуальний хостинг з панеллю | Додати ключ у панелі для свого користувача, доступ до SSH уточнити в підтримці |
| Windows і PuTTY | Вбудований OpenSSH у PowerShell або конвертація в .ppk через puttygen |
На тарифах віртуального хостингу RichHost сайтами керують через власну панель керування з ШІ-помічником, а з питань доступу допомагає підтримка з 10:00 до 20:00 за Києвом.
Часті питання
Чи можна використовувати один ключ для всіх серверів?
Технічно так, але краще мати окремий ключ на кожен пристрій, з якого ви входите. Тоді втрату ноутбука закриває видалення одного рядка з authorized_keys, а не заміна ключа всюди.
Де лежить приватний ключ і чи можна передати його колезі?
У каталозі ~/.ssh (у Windows C:\Users\ім'я\.ssh). Передавати не можна: колега створює власну пару, а ви додаєте його публічний ключ на сервер.
Що робити, якщо я вимкнув паролі і втратив ключ?
Зайти через веб-консоль або KVM у панелі провайдера, додати новий публічний ключ і перезавантажити sshd. На віртуальному хостингу ключ можна додати заново через панель або попросити допомоги в підтримці.
Чи потрібно міняти порт 22?
Це зменшує кількість сміття в логах, але не захищає. Головний захист дають вхід лише за ключем і вимкнені паролі, перевірені через sshd -T.



