SSH-ключі: як створити і використовувати SSH-ключ

Як працює вхід за SSH-ключем, як створити ключ Ed25519 у Windows, macOS і Linux, додати його на сервер чи GitHub і виправити Permission denied (publickey).

Ілюстрація до статті: SSH-ключі: як створити і використовувати SSH-ключ

SSH-ключі — стандартний спосіб заходити на сервери, надсилати код на GitHub чи GitLab і безпечно копіювати файли без введення пароля. Замість секрету, який знаєте і ви, і сервер, у вас є приватний ключ, а на сервері — відповідний публічний. У цій статті — як працює вхід за SSH-ключем, як створити пару ключів у Windows, macOS і Linux, як додати ключ на сервер і через які помилки найчастіше виникає «Permission denied (publickey)».

Що таке SSH-ключі

SSH (Secure Shell) — протокол для виконання команд на віддаленому комп’ютері через шифроване з’єднання. Він підтримує паролі, але паролі можна підібрати, виманити фішингом або використати повторно. Пара SSH-ключів замінює пароль двома файлами:

  • Приватний ключ, наприклад ~/.ssh/id_ed25519. Лишається на вашому комп’ютері, ним ніколи не діляться.
  • Публічний ключ, наприклад ~/.ssh/id_ed25519.pub. Його копіюють на кожен сервер чи сервіс, куди потрібен доступ.

Ключі математично пов’язані, як описано в статті що таке публічний ключ: підписане приватним ключем перевіряється публічним, але з публічного ключа приватний не відтворити.

Як працює вхід за ключем

  1. Ваш комп’ютер підключається до сервера, і обидві сторони встановлюють шифрований канал. Сервер доводить свою справжність ключем хоста.
  2. Клієнт повідомляє, яким публічним ключем хоче скористатися.
  3. Сервер перевіряє, чи є цей ключ у файлі ~/.ssh/authorized_keys користувача.
  4. Якщо є, сервер просить клієнта підписати дані, унікальні для цієї сесії. Клієнт підписує їх приватним ключем.
  5. Сервер перевіряє підпис публічним ключем. Якщо він дійсний — ви увійшли.

Приватний ключ ніколи не залишає ваш комп’ютер, а підписані дані щоразу інші, тож перехоплювачу нічого повторити. Зламаний сервер віддасть лише публічні ключі, які зловмиснику марні.

Як створити SSH-ключ

Windows 10 і 11, macOS та Linux мають вбудований OpenSSH. Відкрийте термінал (у Windows — PowerShell) і виконайте:

ssh-keygen -t ed25519 -C "your-name@laptop"
  • -t ed25519 обирає алгоритм Ed25519: короткий, швидкий і надійний. -t rsa -b 4096 — лише для дуже старих систем.
  • -C додає коментар, щоб потім упізнати ключ.
  • Погодьтеся з типовим розташуванням файлу й задайте passphrase. Вона шифрує приватний ключ на диску, тож викрадений ноутбук чи бекап не дасть доступу.

Щоб не вводити passphrase щоразу, додайте ключ в SSH-агент раз на сесію: ssh-add ~/.ssh/id_ed25519. macOS уміє зберігати його в Keychain, у Windows є служба «OpenSSH Authentication Agent».

Як додати публічний ключ на сервер

Найпростіше в macOS і Linux:

ssh-copy-id user@server.example.com

Команда один раз входить за паролем і дописує ваш публічний ключ у ~/.ssh/authorized_keys. У Windows або без ssh-copy-id зробіть те саме вручну: скопіюйте єдиний рядок із файлу .pub і вставте його новим рядком в authorized_keys на сервері. Перевірте: ssh user@server.example.com має питати passphrase ключа, а не пароль сервера.

Для GitHub, GitLab та подібних сервісів відкрийте Settings → SSH keys, вставте вміст файлу .pub і збережіть. Перевірка: ssh -T git@github.com або ssh -T git@gitlab.com.

Ключі хоста й попередження під час першого входу

Під час першого підключення SSH показує відбиток сервера й питає, чи довіряти йому. Відповідь зберігається в ~/.ssh/known_hosts. Якщо відбиток згодом зміниться, SSH відмовиться підключатися з гучним попередженням. Зазвичай це означає перевстановлений сервер, але може означати й перехоплення з’єднання. Звірте новий відбиток з адміністратором, перш ніж видаляти старий запис командою ssh-keygen -R hostname.

Як виправити «Permission denied (publickey)»

  • Пропонується не той ключ. ssh -v user@host покаже, які ключі пробуються. Вкажіть потрібний явно: ssh -i ~/.ssh/id_ed25519 user@host.
  • Завеликі права доступу. SSH ігнорує ключі, які можуть читати інші. На сервері ~/.ssh має бути 700, authorized_keys — 600; приватний ключ має читати лише власник.
  • Ключ вставлено з помилкою. Публічний ключ — це один суцільний рядок. Переноси, додані редактором чи месенджером, роблять його недійсним.
  • Не той користувач. Ключ встановлено для конкретного акаунта: ssh root@host і ssh deploy@host перевіряють різні файли.
  • Агент не запущено. Якщо ssh-add -l не може під’єднатися до агента, запустіть його або використовуйте -i.

Добрі практики

  • Один ключ — один пристрій. Загубили ноутбук — видаліть лише його публічний ключ із серверів і акаунтів.
  • Завжди ставте passphrase або зберігайте ключ на апаратному ключі безпеки (ssh-keygen -t ed25519-sk).
  • Коли вхід за ключем працює, вимкніть вхід за паролем на своїх серверах (PasswordAuthentication no у sshd_config). Це повністю зупиняє підбір паролів.
  • Ніколи не вставляйте приватний ключ у чат, задачу чи репозиторій. Якщо так сталося — створіть нову пару й приберіть старий публічний ключ звідусіль.
  • Час від часу переглядайте authorized_keys і видаляйте ключі, яких не впізнаєте.

Часті запитання

Чи безпечніші SSH-ключі за паролі?

Так. Ключ надто довгий, щоб його підібрати, сервер ніколи не отримує ваш секрет, а фішинговий сайт не може його перехопити. З passphrase ключ захищений і в разі крадіжки файлу.

Чи можна один ключ використовувати на кількох комп’ютерах?

Скопіювати можна, але краще створити окремий ключ на кожному комп’ютері — тоді втрата одного пристрою не змусить замінювати доступ усюди.

Що робити, якщо загубив приватний ключ?

Відновити його неможливо. Увійдіть іншим способом, наприклад через вебконсоль хмарного провайдера, додайте новий публічний ключ і видаліть старий.

SSH і SFTP — це одне й те саме?

SFTP — протокол передавання файлів, що працює всередині SSH-з’єднання, тому ті самі ключі підходять для обох.

Коротко: створіть пару командою ssh-keygen -t ed25519, захистіть приватний ключ passphrase і копіюйте на сервери та Git-сервіси лише файл .pub. Сервер щоразу перевіряє свіжий підпис, тож ваш секрет ніколи не передається мережею.