В этой статье мы настроим SSH аутентификацию в Windows ключам для безопасного доступа к удаленным компьютерам/серверам. Рассмотрим, как сгенерировать пару ключей в Windows (открытый и закрытый ключи) и настроить встроенные SSH сервер в Windows 10/11 и Windows Server 2025/2022/2019 для аутентификации по SSH ключам (без ввода паролей).
Аутентификация по SSH ключам широко используется в мире Linux, а в Windows этот функционал появился относительно недавно. Идея заключается в том, что на SSH сервере добавляется открытый ключ клиента и при подключении сервер проверяет наличие у подключающегося соответствующего закрытого ключа. Таким образом удаленный пользователь может аутентифицироваться в Windows без ввода пароля.
Генерация SSH ключей на клиенте Windows
Сначала вам нужно сгенерировать пару ключей (открытый и закрытый) на клиентском компьютере (с которого вы будете подключаться к удаленному Windows по SSH). Закрытый ключ хранится на клиенте (не нужно передавать его никому!), а открытый ключ нужно скопировать в файл authorized_keys на SSH сервере.
Чтобы сгенерировать SSH ключи на клиенте Windows, вы должны установить клиент OpenSSH. В современных версиях Windows (начиная с Windows 10 1709) и Windows Server встроенный клиент OpenSSH можно установить как отдельный компонент с помощью PowerShell:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Запустите обычную (непривилегированную сессию PowerShell) и сгенерируйте пару ED25519 ключей:
ssh-keygen -t ed25519
Утилита попросит вас указать пароль для защиты закрытого ключа (passphrase). Если вы укажете пароль, то каждый раз при использовании этого ключа для SSH авторизации, вы должны будете вводить этот пароль. Я не стал указывать пароль для ключа (не рекомендуется).

Generating public/private ed25519 key pair. Enter file in which to save the key (C:\Users\myuser/.ssh/id_ed25519): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in C:\Users\myuser/.ssh/id_ed25519. Your public key has been saved in C:\Users\myuser/.ssh/id_ed25519.pub. The key fingerprint is: SHA256:C2wXeCQSUcJyq0 myuser@computername The key's randomart image is: +--[ED25519 256]--+ | ..*O=..o. | +----[SHA256]-----+
Утилита ssh-keygen по умолчанию сохраняет сгенерированную пару ключей в профиле текущего пользователя Windows, в котором создается каталог .ssh (
%USERPROFILE%\.ssh
). Ключи представляют собой два файла:
ls $env:USERPROFILE\.ssh

-
id_ed25519– закрытый ключ, который должен оставаться на клиенте и не копироваться никуда (если вы сгенерировали ключ типа RSA, файл будет называться id_rsa ) -
id_ed25519.pub– публичный (открытый) ключ, этот ключ нужно будет скопировать на удаленный хост, к которому вы будете подключаться по SSH (аналогичный RSA ключ называется id_rsa.pub )

После того, как ключи созданы, вы можете добавить закрытый ключ в службу SSH Agent, которая позволяет удобно управлять закрытыми ключами и использовать их для аутентификации.
SSH Agent может хранить закрытые ключи и предоставлять их в контексте безопасности текущего пользователя. Запустите службу ssh-agent и настройте автоматический запуск с помощью PowerShell команд управления службами:
Set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent
Добавьте ваш закрытый ключ в базу ssh-agent:
ssh-add "C:\Users\user\.ssh\id_ed25519"
Identity added: C:\Users\kbuldogov\.ssh\id_ed25519 (kbuldogov@computername)

Или так:
ssh-add.exe $ENV:UserProfile\.ssh\id_ed25519
Настройка OpenSSH в Windows для аутентификации по SSH ключам
После того, как вы сгенерировали ключи на клиенте, можно перейти к настройке SSH сервера. В нашем примере это обычный компьютер с Windows 11 и настроенной службой OpenSSH.
Проверяем что служба OpenSSH сервера установлена и запущена:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Ser*'
Get-Service sshd

Настройки сервера OpenSSH в Windows хранятся в текстовом конфигурационном файле
C:\ProgramData\ssh\sshd_config
. По умолчанию в файле sshd_config не включена аутентификация по ключам. Проверьте список разрешенных способов аутентификации в OpenSSH с помощью такой PowerShell команды (Select-String используется как аналог grep в PowerShell):
cat "C:\ProgramData\ssh\sshd_config"| Select-String "Authentication"
#PubkeyAuthentication yes #HostbasedAuthentication no # HostbasedAuthentication PasswordAuthentication yes #GSSAPIAuthentication no

В этом примере строка PubkeyAuthentication закомментирована, значит этот способ аутентификации отключен.
Откройте файл sshd_config с помощью блокнота, раскоментируйте строку:
Notepad C:\ProgramData\ssh\sshd_config
PubkeyAuthentication yes

После внесения любых изменений в конфигурационный файл sshd_config службу нужно перезапускать:
Restart-service sshd
Дополнительно в файле sshd_config вы можете запретить SSH подключение по паролю по паролю. Настройте в конфигурации такую опцию:
PasswordAuthentication no
Можно включить эту опцию командой:
(Get-Content C:\ProgramData\ssh\sshd_config).Replace("#PasswordAuthentication yes","PasswordAuthentication no") | Set-Content C:\ProgramData\ssh\sshd_config
Вход по SSH ключу для администраторов и пользователей Windows
Далее нужно скопировать значение из файла открытого ключа (id_ed25519.pub) с клиента на сервер. Куда копировать значение ключа зависит от того, входит ли пользователь, под которым вы будете подключаться в группу локальных администраторов (Administrators) или нет.
- Для обычных пользователей (не администраторов), ключи добавляются в файл
authorized_keysв профиле пользователя. Это поведение задается вот этим параметром в конфиг файле:Get-Content C:\ProgramData\ssh\sshd_config | Select-String -Pattern "^AuthorizedKeysFile"AuthorizedKeysFile .ssh/authorized_keys

- Для локальных администраторов, ключи нужно добавлять в файл C:\ProgramData\ssh\
administrators_authorized_keys. Это также задано в конфиге:Get-Content C:\ProgramData\ssh\sshd_config -Tail 2 Match Group administratorsAuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Предположим, нам нужно настроить SSH доступ под непривилегированным пользователем user1.
Скопируйте файл id_ed25519.pub на SSH сервер в каталог .ssh профиля пользователя, под которым вы будете подключаться к SSH серверу. Например, у меня в Windows 11 создан пользователь user1, значит я должен скопировать ключ в файл C:\Users\user1\.ssh\authorized_keys.
В файле authorized_keys при необходимости можно добавить несколько SSH ключей, каждый с новой строки.
Если каталог
.ssh
в профиле отсутствует, его нужно создать вручную.

Можно скопировать ключ на SSH сервер с клиента с помощью SCP:
scp C:\Users\youruser\.ssh\id_rsa.pub admin@192.168.1.90:c:\users\user1\.ssh\authorized_keys
Либо можете скопировать содержимое файла открытого ключа на клиенте в буфер обмена:
Get-Content C:\Users\sysops\.ssh\id_ed25519.pub|Set-Clipboard
Вставьте полученное значение ключа в следующий PowerShell скрипт и выполните его на сервере SSH. Это добавит открытый ключ в профиль пользователя:
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.ssh"
Add-Content -Force -Path "$env:USERPROFILE\.ssh\authorized_keys" -Value 'ssh-ed25519 AAAAxxxxxxxxxx sysops@home-S6G9U9C'

Если пользователь, под которым вы хотите подключиться к Windows хосту по SSH входит в локальную группу Administrators (SID группы
S-1-5-32-544
):
Чтобы разрешить подключение по SSH под таким пользователем, добавьте открытый ключ в этот текстовый файл.
Откройте файл
C:\ProgramData\ssh\administrators_authorized_keys
и скопируйте в него строку с открытым ssh-ed25519 ключом с клиента.

В старых версиях OpenSSH для корректного подключения под администратором приходилось отключать режим StrictModes в конфигурационном файле sshd_config. По умолчанию этот режим включен и запрещает аутентификацию по ключам, если закрытый и открытый ключ недостаточно защищены. Раскомментируйте строку
#StrictModes yes
, измените на
StrictModes no
.

В целях безопасности права на конфигурационный файл sshd_config должны быть только у группы Administrators и SYSTEM). Вы можете изменить NTFS права на файл с помощью:
- утилиты icacls:
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F - или с помощью PowerShell командлетов get-acl и set-acl:
get-acl "$env:programdata\ssh\ssh_host_rsa_key" | set-acl "$env:programdata\ssh\administrators_authorized_keys"

После этого SSH аутентификация по ключам работает даже при отключенном режиме StrictModes
Закомментируйте строки:
#Match Group administrators # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

После сохранения изменений в файле sshd_config не забудьте перезапустить службу sshd.
restart-service sshd
Подключаемся к SSH серверу по ключу из Windows
Теперь вы можете подключиться к SSH серверу без ввода пароля пользователя.
Для подключения через SSH к удаленному хосту используется следующая команда:
ssh (username)@(имя или IP адрес SSH сервера)
Например,
ssh user1@192.168.1.90
Это означает, что вы хотите подключиться к удаленному SSH серверу с адресом
192.168.1.90
под учетной записью
user1
. Служба SSH Agent автоматически попытается использовать для авторизации сохраненный ранее закрытый ключ. А если вы не задали пароль (passphrase) защиты для закрытого ключа, вы сразу автоматически подключитесь к вашему удаленному серверу Windows.

При первом подключении нужно добавить отпечаток ключа SSH сервера в доверенные. Наберите yes -> Enter.
The authenticity of host '192.168.1.90 (192.168.1.90)' can't be established. ECDSA key fingerprint is SHA256:LNMJTbTS0EmrsGYTHB3Aa3Tisp+7fvHwZHbTA900ofw. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Дополнительные полезные опции SSH клиента:
-
-v– отображать детальный лог SSH подключения -
-i– вручную указать путь к файлу закрытого ключа:ssh user1@192.168.14.145 -i "C:\Users\user\.ssh\id_ed25519" - для подключения с помощью учетной записи пользователя из домена Active Directory используется формат:
ssh kbuldogov@winitpro.ru@192.168.1.90илиssh winitpro\adm1@ws025
Информацию по логам аутентификации в Windows с помощью SSH ключей можно найти в журнале события. В современных версиях OpenSSH логи пишутся не в текстовые файлы, а в отдельный журнал Event Viewer (Application and services logs -> OpenSSH -> Operational).
При успешном SSH подключении с помощью ключа в журнале появится событие:
EventID 4 sshd: Accepted publickey for locadm from 192.168.14.1 port 55772 ssh2: ED25519 SHA256:FEHDWM/J74FbIzCCoJNbh14phS67kQgh7k8UrKPSvCM

Если вы установили PasswordAuthentication no, и некорректно настроите аутентификацию по ключам, то при подключении по ssh будет появляться ошибка:
user1@192.168.14.145: Permission denied (publickey,keyboard-interactive).

Итак, вы настроили SSH аутентификацию в Windows по паре ключей, открытому и закрытому. Теперь вы можете использовать такой способ аутентификации для безопасного доступа к удаленным северам, автоматического поднятия проброса портов в SSH туннеле, запуска скриптов и других задач автоматизации.


Спасибо! Первая рабочая статья -_ stackoverflow.com уже весь на эту тему перечитал).
debug1: Found key in C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/known_hosts:9
debug2: set_newkeys: mode 1
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey after 134217728 blocks
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_rsa (000002372A7B17D0), agent
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_dsa (0000000000000000)
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_ecdsa (0000000000000000)
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_ed25519 (0000000000000000)
debug2: key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_xmss (0000000000000000)
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:5U76PQzmZJ7xce9TDvyt1P/sqNCX/GHOZSLk3TR3x1o C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Trying private key: C:\\Users\\\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214/.ssh/id_dsa
Можете подсказать что не так?
Какую команду используете для SSH подключения? Ключ добавлен в ssh-agent?
Попробуйте указать путь к вашему файлу с закрытым ключом вручную:
ssh root@192.168.1.90 -i "C:\Users\user1\.ssh\id_rsa"При генерации ключа не нашел файлы в профиле пользователя. Они были в «C:\Windows\System32»
Скорее всего вы запускали cmd\powershell.exe в режиме administrator, поэтому путь по-умолчанию был c:\windows\system32
А как это работает, если сервер на Linux, а клиент на Windows?
Да, все аналогично. Только в linux другое место хранения ключей (в зависимости от дистрибутива)
Ну наконец то получилось по ssh ключу подключиться. Мне нужно было настроить SFTP на Windows 10. Имеются 3 компа, на первом Windows 10 с openssh server и запущенным процессом sftp-server.exe, на втором компе клиенте тоже Windows 10 установил openssh client, сгенерировал публичный и приватный ключ, публичный скопировал на первый комп с Windows 10 где установлен openssh server, переименовал его из id_rsa.pub в authorized_keys. Затем на втором компе клиенте нужно установить PuTTY Key Generator и сконвертировать приватный ключ id_rsa в id_rsa.ppk это нужно чтобы подключиться по SFTP через WinSCP или FileZilla client к серверу openssh. Проблема была в том что всё равно просил пароль от учётной записи администратора от первого компа на сервере. После того как прописал «PubkeyAuthentication yes» и «PasswordAuthentication no» затем «StrictModes no» и закомментировал «# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys» стало заходить без пароля. Есть ещё вопрос. Третий комп это ноутбук с Kubuntu, установил FileZilla client, уже имеется каталог по адресу /home/sergei/.ssh/ в этот каталог скопировал файл id_rsa.ppk со второго компа, то есть с Windows 10. При подключении FileZilla client выбираю протокол SFTP всё как положено, указываю файл с приватным ключом /home/sergei/.ssh/id_rsa.ppk и подключаюсь без ввода пароля, всё работает. Но я так понимаю что это неправильно? На Kubuntu тоже надо генерировать ключи приватный и публичный? И где тогда размещать новый публичный ключ на сервере, если на нём уже есть C:\Users\Sergei\.ssh\authorized_keys
В файле authorized_keys можно указывать несколько ключей. Просто скопируйте значение второго ключа с новой строки и сохраните файл.
Всё теперь разобрался, Спасибо.
Модуль OpenSSHUtis установился только так
Проделал все операции — но всё равно пишет Permission denied (publickey,keyboard-interactive)
Ключ прописал, строки комментировал. Куда ещё посмотреть?:
Обновил статью. Самый простой вариант — посмотрите в сторону директивы StrictModes no
Вы подключаетесь под admin пользователем?
да. В итоге с помощью танцев с бубнами и такой то матери оно завелось. Но к примеру если хочешь посмотреть в AD через ssh ТО нужно всё равно вводить логин и пароль для доступа к домену. Оно не умеет использовать ту же учётную запись с которой заходишь в ssh
Изначально нашел ссылку
https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
Не работает — хоть ты тресни) Навозился…
В итоге проблему решило указание имени без домена.
То есть вариант домен\юзер требует пароль.
Указал просто юзер — получилось)
Подскажите пожалуйста, настроил SSH и спокойно подключаюсь через с андроида JuiseSSH , ввожу пару user@имякомпа , ввожу пароль заходит в терминал PowerShell. Но это всё работает лишь на домашнем вайфае, как мне сделать так чтобы я вне своей сети мог подключиться к своему компу?
И ещё когда ввожу root@192. *.*.* (ip адрес своего компа) просит пароль, все свои пароли перепробовал не подключается, где хранится этот пароль не подскажите директорию?
Простите если что не так я только учусь настраивать удалённые подключения (любитель) для своего компа с телефона.
После того как с Juise_SSH подключился root@192.*.*.* попросило подтвердить ключ(pub), подтвердил , но запросило пароль 🙁
Так ты сначала создай его для root. Вот же sudo passwd root _https://losst.ru/parol-root-v-ubuntu
ssh ключи можно хранить и брать из AD
_https://www.saotn.org/retrieve-ssh-public-key-from-active-directory-for-ssh-authentication/
_https://access.redhat.com/solutions/5353351
В Linux можно ограничить выполнение каких-то команд при подключении по SSH с аутентификацией через сертификат. Для этого
В файл authorized_keys перед самим сертификатом добавить разрешающую команду:
command=»top» ssh-rsa your_thumbprint
У меня удалённый комп на debian и там авторизация по ключу. На локальном компе юзаю PuTTY в котором указываю место хранения ключа. Но хочется подключаться через PS командой ssh user@host
я так понимаю, достаточно командой ssh-add «C:\Users\user\.ssh\id_ed25519» указать место хранения ключа в винде — и система сама будет его находить и использовать, при коннекте с удалённой машиной?
В стандартном клиенте SSH Windows 2019 который ставится пошиком как я понял не работают указанные директивы в отличие от linux.
KexAlgorithms
Ciphers
MACs
Или все же работает?
И как указать принудительно только использование SSHv2?
The following configuration arguments aren’t available in the OpenSSH version that ships in Windows Server and the Windows client:
AcceptEnv
AllowStreamLocalForwarding
AuthorizedKeysCommand
AuthorizedKeysCommandUser
AuthorizedPrincipalsCommand
AuthorizedPrincipalsCommandUser
Compression
ExposeAuthInfo
GSSAPICleanupCredentials
GSSAPIStrictAcceptorCheck
HostbasedAcceptedKeyTypes
HostbasedAuthentication
HostbasedUsesNameFromPacketOnly
IgnoreRhosts
IgnoreUserKnownHosts
KbdInteractiveAuthentication
KerberosAuthentication
KerberosGetAFSToken
KerberosOrLocalPasswd
KerberosTicketCleanup
PermitTunnel
PermitUserEnvironment
PermitUserRC
PidFile
PrintLastLog
PrintMotd
RDomain
StreamLocalBindMask
StreamLocalBindUnlink
StrictModes
X11DisplayOffset
X11Forwarding
X11UseLocalhost
XAuthLocation
_https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_server_configuration
RSA ключи сейчас не рекомендуется ипсользовать. В новой версии OpenSSH даже при использованиии RSA ключа длиной 4096 появляется варнинг «Refuse RSA keys <1024 bits in length and improve reporting for keys that do not meet this requirement".
В место них лучше использовать протокол Ed25519 — в статье это уже описано. Кроме того Ed25519 ключ просто намного короче, чем RSA файл ключа
Спасибо за детальное объяснение!
навозился с этим ssh
оказывается надо было закомментировать
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
при попытке set-service ssh-agent startuptype ‘automatic’ сыплет красным. вообще PS плохо себя ведёт, неадмином недаёт, с правами админа кладёт всё куда попало (exe в system32\openssh, а ключи в programdata, хотя божился, что положил в профиль юзера)