Пара ключей намного безопаснее пароля: закрытый ключ никогда не покидает ваш компьютер, и боты, сканирующие порт 22, не могут его подобрать. В Windows 10 и 11 уже есть OpenSSH, поэтому вы создадите ключ, установите его на VPS Linux Infrawire, загрузите его в службу ssh-agent Windows и в конце отключите вход по паролю.
📋 Требования
- Windows 10 или 11 с клиентом OpenSSH (проверьте командой
ssh -Vв PowerShell). - Linux VPS (Ubuntu 24.04, Debian 12, AlmaLinux 9 или Rocky 9), на который вы ещё можете войти по паролю: в личном кабинете вы найдёте IP и пароль root вашего VPS.
- Около десяти минут и вторая SSH-сессия или консоль VPS на случай ошибки.
PowerShellssh -V
🔐 Создание ключа ed25519
Откройте PowerShell (обычный, не от администратора) и выполните:
PowerShellssh-keygen -t ed25519 -C 'USER@my-pc'
Согласитесь с путём по умолчанию C:\Users\USER\.ssh\id_ed25519 и задайте парольную фразу. Она шифрует закрытый ключ на диске, поэтому украденный файл бесполезен. Создаются два файла: id_ed25519 (закрытый, никому его не передавайте) и id_ed25519.pub (открытый).
📤 Копирование открытого ключа на VPS
В Windows нет ssh-copy-id, поэтому установите ключ вручную. Сначала выведите открытый ключ и скопируйте строку целиком:
PowerShellGet-Content $env:USERPROFILE\.ssh\id_ed25519.pub
Войдите по паролю и добавьте эту строку на сервере (замените пример между одинарными кавычками на ваш настоящий ключ):
Bashssh root@VPS_IP mkdir -p ~/.ssh && chmod 700 ~/.ssh echo 'ssh-ed25519 AAAA...your-key... USER@my-pc' >> ~/.ssh/authorized_keys sed -i 's/\r$//' ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
Строка с sed убирает windows-окончания строк, из-за которых ключ стал бы нечитаемым. Не передавайте ключ в ssh через конвейер PowerShell: Windows PowerShell 5.1 может добавить к данным символы возврата каретки.
🧰 Включение ssh-agent в Windows
Без агента парольную фразу придётся вводить при каждом входе. Служба ssh-agent установлена, но по умолчанию отключена или запускается вручную. В PowerShell от администратора:
PowerShellGet-Service ssh-agent | Set-Service -StartupType Automatic Start-Service ssh-agent Get-Service ssh-agent
Затем в обычном PowerShell один раз загрузите ключ и выведите список загруженных ключей:
PowerShellssh-add $env:USERPROFILE\.ssh\id_ed25519 ssh-add -l
Агент сохраняет ключ и после перезагрузки, так что повторно его запрашивать не будут.
✅ Проверка входа по ключу
Подключитесь снова. Вы должны получить консоль без запроса пароля root:
PowerShellssh root@VPS_IP
Чтобы точно увидеть используемый метод, добавьте -v и найдите Server accepts key и Authenticated to ... using publickey:
PowerShellssh -v root@VPS_IP
Не переходите дальше, пока это не работает, и держите эту сессию открытой.
🚫 Отключение входа по паролю на сервере
В Ubuntu и Debian каталог /etc/ssh/sshd_config.d/ может уже содержать файл (например, 50-cloud-init.conf), разрешающий пароли. SSH берёт первое прочитанное значение, поэтому создайте файл, который идёт раньше по порядку. Выполните от root на VPS:
Bashgrep -ri 'PasswordAuthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ cat > /etc/ssh/sshd_config.d/10-keys-only.conf <<'EOF' PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes PermitRootLogin prohibit-password EOF sshd -t && systemctl reload ssh
В AlmaLinux/Rocky служба называется sshd: используйте systemctl reload sshd. Убедитесь, что основной sshd_config содержит в начале строку Include /etc/ssh/sshd_config.d/*.conf (так по умолчанию). Если синтаксис верен, sshd -t ничего не выводит.
Из нового окна проверьте, что пароли теперь отклоняются, а ключ по-прежнему работает:
PowerShellssh -o PubkeyAuthentication=no root@VPS_IP
Ожидаемый ответ — Permission denied (publickey).
🛠️ Устранение неполадок
Permission denied (publickey). Ключа нет в authorized_keys нужной учётной записи, он вставлен в несколько строк или неверны права. На сервере выполните chmod 700 ~/.ssh и chmod 600 ~/.ssh/authorized_keys и убедитесь, что строка начинается с ssh-ed25519.
WARNING: UNPROTECTED PRIVATE KEY FILE. Другие учётные записи Windows могут прочитать ваш закрытый ключ. Ограничьте доступ только вашим пользователем:
PowerShellicacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r /grant:r "${env:USERNAME}:F"
Error connecting to agent: No such file or directory. Служба ssh-agent не запущена; запустите её, как показано выше.
Доступ потерян после изменения. Откройте консоль VPS в личном кабинете, удалите /etc/ssh/sshd_config.d/10-keys-only.conf, выполните sshd -t и перезагрузите службу SSH.
🚀 Ваш компьютер с Windows теперь входит на VPS по ключу ed25519, а пароли отключены. Сохраните копию закрытого ключа в надёжном месте.