Настройка ключей OpenSSH в Windows 11
· ssh, windows, ssh-agent, ключи
Пост описывает работу с SSH-ключами на клиенте под Windows 11: создание ключа, хранение в ssh-agent, передача на сервер и подключение. Настройку самого Linux-сервера (отключение паролей, смена порта) см. в посте Настройка и запуск веб-сервера.
Все команды выполняются в PowerShell (Терминал Windows). Где нужны права администратора, это указано отдельно.
Что есть в Windows 11
В Windows 11 есть встроенная реализация OpenSSH:
- клиент (
ssh,scp,ssh-keygen,ssh-agent,ssh-add) установлен по умолчанию, файлы лежат вC:\Windows\System32\OpenSSH; - сервер (
sshd) устанавливается отдельно: «Параметры» (Win + I) → «Система» → «Дополнительные компоненты» → «Добавление дополнительного компонента».
Для подключения к 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
Команда спросит:
- Путь к файлу. Нажмите Enter, чтобы принять значение по умолчанию
$env:USERPROFILE\.ssh\id_ed25519. - Парольную фразу (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. Парольную фразу вы вводите один раз.
Что это значит для безопасности:
- ключ в агенте защищён вашей учётной записью Windows, а не самим алгоритмом шифрования;
- процесс с правами администратора может извлечь такие ключи. Это показано в исследовании ropnop;
- поэтому ключ нужно защищать парольной фразой и ограничивать права на компьютере.
Резервная копия и удаление файла ключа
Microsoft рекомендует сделать резервную копию закрытого ключа в безопасном месте и после добавления в агент удалить файл с локального диска.
Если следуете этому совету:
- Сначала убедитесь, что вход с ключом из агента работает (раздел «Подключение»).
- Копию храните в зашифрованном виде: менеджер паролей, зашифрованный контейнер или диск с шифрованием. Не кладите ключ на флешку открытым файлом.
- Парольная фраза обязательна. Без неё любая копия ключа сразу даёт доступ к серверам.
Если ключ потерян, нужно создать новую пару и заменить открытый ключ на всех серверах.
Передача открытого ключа на сервер
В 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’ом или указан неверно. См. пост про настройку сервера |
Справка и источники
- Начало работы с OpenSSH для Windows
- Руководство по SSH в Терминале Windows
- Key-based authentication in OpenSSH for Windows
- ropnop/windows_sshagent_extract — исследование о хранении ключей агентом Windows