Настройка ключей OpenSSH в Windows 11

· ssh, windows, ssh-agent, ключи

Пост описывает работу с SSH-ключами на клиенте под Windows 11: создание ключа, хранение в ssh-agent, передача на сервер и подключение. Настройку самого Linux-сервера (отключение паролей, смена порта) см. в посте Настройка и запуск веб-сервера.

Все команды выполняются в PowerShell (Терминал Windows). Где нужны права администратора, это указано отдельно.

Что есть в Windows 11

В Windows 11 есть встроенная реализация OpenSSH:

Для подключения к Linux-серверу нужен только клиент. Этот пост про него.

Проверка:

ssh -V

Если команда не найдена, добавьте компонент «Клиент OpenSSH» там же, в «Дополнительных компонентах».

Где хранятся ключи

Ключи и настройки клиента лежат в каталоге .ssh вашего профиля:

C:\Users\<имя_пользователя>\.ssh\

В PowerShell этот путь записывается как $env:USERPROFILE\.ssh\. Если каталога нет, ssh-keygen создаст его сам.

Файл Назначение
id_ed25519 закрытый ключ. Его нельзя никому передавать
id_ed25519.pub открытый ключ. Его копируют на серверы
known_hosts отпечатки серверов, к которым вы уже подключались
config настройки подключений (необязательный)

Создание ключа

ssh-keygen -t ed25519

Команда спросит:

  1. Путь к файлу. Нажмите Enter, чтобы принять значение по умолчанию $env:USERPROFILE\.ssh\id_ed25519.
  2. Парольную фразу (passphrase). Задайте её. Она шифрует закрытый ключ на диске: если файл украдут, без фразы им нельзя воспользоваться. Вводить её придётся только один раз, при добавлении ключа в ssh-agent (см. ниже).

Алгоритм ed25519 даёт короткие ключи и считается современным выбором. Необязательный параметр -C "комментарий" добавит подпись в открытый ключ, например -C "laptop". Так проще отличать ключи на сервере.

Если ключи уже есть

Поместите файлы в $env:USERPROFILE\.ssh\. Если каталога нет, создайте его.

Скопированный закрытый ключ часто вызывает ошибку:

WARNING: UNPROTECTED PRIVATE KEY FILE!
Permissions for '...\id_ed25519' are too open.

Windows OpenSSH требует, чтобы доступ к закрытому ключу был только у вас. Уберите унаследованные права и оставьте себе чтение:

icacls "$env:USERPROFILE\.ssh\id_ed25519" /inheritance:r
icacls "$env:USERPROFILE\.ssh\id_ed25519" /grant:r "$($env:USERNAME):(R)"

ssh-agent: хранение ключа

ssh-agent держит расшифрованный ключ в памяти службы, и клиент ssh берёт его оттуда сам. Парольную фразу не нужно вводить при каждом подключении.

Включить службу

По умолчанию служба отключена. Включить её можно только из PowerShell, запущенного от имени администратора:

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent

Последняя команда должна показать статус Running.

Добавить ключ

Закройте окно администратора и откройте обычный PowerShell. Права администратора для добавления ключа не нужны:

ssh-add $env:USERPROFILE\.ssh\id_ed25519

Введите парольную фразу. Проверка списка ключей в агенте:

ssh-add -l

Вывод показывает длину ключа, отпечаток и комментарий. Убрать ключ из агента:

ssh-add -d $env:USERPROFILE\.ssh\id_ed25519    # один ключ
ssh-add -D                                     # все ключи

Как агент хранит ключи

В отличие от Linux, агент в Windows запоминает ключи надолго. Он сохраняет их в реестре (HKCU\Software\OpenSSH\Agent\Keys), защищая средствами Windows (DPAPI), привязанными к вашей учётной записи. Ключи остаются доступны после выхода из системы и перезагрузки, пока вы не удалите их командой ssh-add -d или ssh-add -D. Парольную фразу вы вводите один раз.

Что это значит для безопасности:

Резервная копия и удаление файла ключа

Microsoft рекомендует сделать резервную копию закрытого ключа в безопасном месте и после добавления в агент удалить файл с локального диска.

Если следуете этому совету:

  1. Сначала убедитесь, что вход с ключом из агента работает (раздел «Подключение»).
  2. Копию храните в зашифрованном виде: менеджер паролей, зашифрованный контейнер или диск с шифрованием. Не кладите ключ на флешку открытым файлом.
  3. Парольная фраза обязательна. Без неё любая копия ключа сразу даёт доступ к серверам.

Если ключ потерян, нужно создать новую пару и заменить открытый ключ на всех серверах.

Передача открытого ключа на сервер

В Windows нет команды ssh-copy-id. Работает универсальная схема из трёх шагов. Пока на сервере порт 22, подключайтесь без дополнительных параметров. Если порт другой, добавьте -P 2222 к scp и -p 2222 к ssh.

1. Скопируйте файл открытого ключа в домашний каталог пользователя на сервере:

scp $env:USERPROFILE\.ssh\id_ed25519.pub your_username@host:

Двоеточие в конце обязательно: оно означает домашний каталог. Сервер спросит пароль пользователя.

2. Подключитесь к серверу и добавьте ключ в authorized_keys:

ssh your_username@host

Дальше команды выполняются на сервере:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
rm ~/id_ed25519.pub

Знак >> дописывает ключ в конец файла и не затирает уже имеющиеся. Проверьте, что каждый ключ в файле занимает отдельную строку:

cat ~/.ssh/authorized_keys

3. Выйдите (exit) и проверьте вход.

Подключение

ssh your_username@host

При первом подключении к серверу SSH покажет его отпечаток и спросит подтверждение:

Are you sure you want to continue connecting (yes/no/[fingerprint])?

Ответ yes запишет сервер в known_hosts. В следующий раз SSH предупредит, если отпечаток изменился.

Если после этого пароль не спрашивается, ключ работает. Если сервер всё же просит пароль, смотрите раздел «Типичные проблемы».

Подключение на нестандартном порту:

ssh -p 2222 your_username@host

Файл config

Чтобы не вводить параметры каждый раз, создайте файл настроек клиента. У него нет расширения:

New-Item -ItemType File -Force $env:USERPROFILE\.ssh\config
notepad $env:USERPROFILE\.ssh\config

Содержимое:

Host myserver
    HostName host
    User your_username
    Port 2222

После этого подключение выглядит так:

ssh myserver

Тот же алиас работает в scp и rsync: scp file.txt myserver:.

Типичные проблемы

Симптом Причина и решение
ssh не найден не установлен клиент OpenSSH. «Дополнительные компоненты» → «Клиент OpenSSH»
unable to start ssh-agent service, error :1058 служба ssh-agent отключена. Включите её от администратора (см. выше)
WARNING: UNPROTECTED PRIVATE KEY FILE! слишком широкие права на файл ключа. Исправляется командами icacls
Permission denied (publickey) ключа нет в authorized_keys, неверные права на ~/.ssh или authorized_keys на сервере, указан не тот пользователь или порт. Проверьте ssh-add -l: ключ должен быть в агенте
Сервер всё равно просит пароль на сервере ещё не отключён вход по паролю, а вход по ключу не сработал. Подробный вывод покажет причину: ssh -v your_username@host
REMOTE HOST IDENTIFICATION HAS CHANGED отпечаток сервера не совпал с known_hosts (например, сервер переустановили). Если уверены, что это ваш сервер, удалите запись: ssh-keygen -R host, для нестандартного порта ssh-keygen -R "[host]:2222"
Connection timed out / Connection refused порт закрыт firewall’ом или указан неверно. См. пост про настройку сервера

Справка и источники