Вики / Сеть
SSH-ключи и ssh-agent
Генерация ключей, authorized_keys, ssh-agent, права на файлы .ssh.
Аутентификация по ключам надёжнее пароля. Пара: приватный ключ (хранится у тебя,
секрет) и публичный (кладётся на сервер в ~/.ssh/authorized_keys). Сервер
шифрует челлендж публичным ключом — расшифровать может только владелец приватного.
ssh-keygen -t ed25519 -C "me@laptop" # сгенерировать (ed25519 — современный выбор)
# приватный: ~/.ssh/id_ed25519 · публичный: ~/.ssh/id_ed25519.pub
ssh-copy-id user@host # закинуть публичный на сервер
ssh-keygen -t ed25519 -C "me@laptop" # рекомендуемый тип
ssh-keygen -t rsa -b 4096 -C "legacy" # если требуется RSA (старые системы)
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key # своё имя файла (несколько ключей)
ssh-keygen -p -f ~/.ssh/id_ed25519 # сменить/добавить пароль на ключ
ssh-keygen -y -f ~/.ssh/id_ed25519 # восстановить .pub из приватного
ssh-keygen -l -f ~/.ssh/id_ed25519.pub # отпечаток (fingerprint)
ssh-keygen -t ed25519 -N '' -f key # без пароля (для автоматизации/CI)
Установка на сервер:
ssh-copy-id user@host # самый простой способ
ssh-copy-id -i ~/.ssh/deploy_key.pub user@host # конкретным ключом
cat ~/.ssh/id_ed25519.pub | ssh host 'cat >> ~/.ssh/authorized_keys' # вручную
SSH отказывает, если права слишком открыты (видит как небезопасные):
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519 # приватный ключ — только владельцу
chmod 644 ~/.ssh/id_ed25519.pub
chown -R "$USER:$USER" ~/.ssh
Агент держит расшифрованный ключ в памяти, чтобы не вводить пароль к ключу каждый раз:
eval "$(ssh-agent -s)" # запустить агент
ssh-add ~/.ssh/id_ed25519 # добавить ключ (спросит пароль ключа один раз)
ssh-add -l # какие ключи загружены
ssh-add -t 3600 ~/.ssh/key # с авто-выгрузкой через час
ssh-add -d ~/.ssh/key # убрать один ключ
ssh-add -D # убрать все
ssh -A user@host # проброс агента (forwarding) — только на доверенные!
Permission denied (publickey)
- Публичный ключ есть в
~/.ssh/authorized_keysна сервере? - Права:
~/.ssh=700,authorized_keys=600, владелец — сам пользователь. В журнале сервера:journalctl -u ssh→ «Authentication refused: bad ownership or modes». - Клиент шлёт нужный ключ?
ssh -v hostпокажет, какие ключи пробует; укажи явноssh -i ~/.ssh/key hostили пропиши в~/.ssh/config(IdentityFile).
Каждый раз спрашивает пароль к ключу
Ключ не в агенте: ssh-add ~/.ssh/id_ed25519. Чтобы автоматически — AddKeysToAgent yes
в ~/.ssh/config (см. ssh-client).
Сервер вообще не принимает ключи
На сервере в sshd_config: PubkeyAuthentication yes, и каталог/файл не в обход
AuthorizedKeysFile. После правки — sudo systemctl reload ssh (см. sshd).
Несколько ключей — подходит не тот / «Too many authentication failures»
Агент перебирает все ключи и упирается в лимит. Укажи конкретный: ssh -i key -o IdentitiesOnly=yes host.
Потерял приватный ключ
Восстановить нельзя — генерируй новый и обнови authorized_keys на серверах.
(Из приватного можно достать публичный ssh-keygen -y, но не наоборот.)
ssh-keygen -t ed25519 # создать пару
ssh-copy-id user@host # установить на сервер
ssh-keygen -l -f key.pub # отпечаток
chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
ssh-add ~/.ssh/id_ed25519 # в агент
ssh -i ~/.ssh/key -o IdentitiesOnly=yes host # конкретным ключом
См. также
- SSH-клиент (ssh, scp, туннели) — Сеть
- sshd (SSH-сервер) — Службы и systemd