Przejdź do treści
Aktualny kupon:10% zniżkiUżyj w zamówieniu

Klucz SSH: logowanie bez hasła (ed25519, PuTTYgen)

Utwórz klucz SSH ed25519, prześlij go na VPS i bezpiecznie wyłącz logowanie hasłem. Kroki dla Windows, macOS, Linux i PuTTY, łącznie z ssh-agent i plikiem ~/.ssh/config.

  • początkujący
  • ~15 min
  • Zaktualizowano 9.10.2026

Utworzysz klucz SSH, prześlesz go na VPS i zalogujesz się bez hasła. Na koniec wyłączysz logowanie hasłem, więc zgadywanie haseł straci sens. Kroki obejmują Windows, macOS, Linux i PuTTY.

Czego potrzebujesz

  • VPS w StormHost z Ubuntu 24.04 lub Debianem 13
  • Działające połączenie SSH hasłem (poradnik)
  • Komputer z Windows 10/11, macOS lub Linux
  • Około 15 minut

Jak działa klucz SSH#

Klucz SSH składa się z dwóch plików, które do siebie należą:

PlikPrzykładowa nazwaGdzie jestKomu go dać
Klucz prywatnyid_ed25519 (PuTTY: .ppk)Tylko na Twoim komputerze.Nikomu. Kto go ma, może logować się jako Ty.
Klucz publicznyid_ed25519.pubNa VPS w pliku ~/.ssh/authorized_keys.Możesz umieścić go gdziekolwiek; nie da się go nadużyć.

Przy logowaniu VPS wysyła Twojemu komputerowi wyzwanie, które rozwiąże tylko posiadacz klucza prywatnego. Klucz prywatny nigdy nie opuszcza Twojego komputera. Klucz ed25519 jest nowoczesny, krótki i bezpieczny, a obsługują go wszystkie aktualne systemy.

Klucz prywatny możesz też zabezpieczyć hasłem klucza (passphrase). Jeśli ktoś skopiuje plik klucza, bez tego hasła go nie użyje.

Tworzenie klucza#

Windows

  1. Otwórz Terminal (prawym przyciskiem Start › Terminal; w Windows 10 Windows PowerShell).

  2. Uruchom:

    PowerShell
    ssh-keygen -t ed25519 -C "notebook-jan"
  3. Przy pytaniu Enter file in which to save the key (C:\Users\jan/.ssh/id_ed25519): naciśnij Enter. Klucz zapisze się w domyślnym miejscu, gdzie SSH sam go znajdzie.

  4. Przy Enter passphrase wpisz hasło klucza i naciśnij Enter. Przy Enter same passphrase again powtórz je. Hasło się nie wyświetla. Jeśli zostawisz je puste, klucz nie będzie zabezpieczony.

Wynik: pliki C:\Users\<USER>\.ssh\id_ed25519 (prywatny) i id_ed25519.pub (publiczny).

macOS

  1. Otwórz aplikację Terminal.

  2. Uruchom:

    bash
    ssh-keygen -t ed25519 -C "macbook-jan"
  3. Przy pytaniu Enter file in which to save the key naciśnij Enter.

  4. Wpisz i powtórz hasło klucza (passphrase).

Wynik: ~/.ssh/id_ed25519 i ~/.ssh/id_ed25519.pub.

Linux

  1. Otwórz terminal.

  2. Uruchom:

    bash
    ssh-keygen -t ed25519 -C "pc-jan"
  3. Przy pytaniu Enter file in which to save the key naciśnij Enter.

  4. Wpisz i powtórz hasło klucza (passphrase).

Wynik: ~/.ssh/id_ed25519 i ~/.ssh/id_ed25519.pub.

Co robi polecenie:

  • ssh-keygen – program do tworzenia kluczy SSH.
  • -t ed25519 – typ klucza. Zalecamy Ed25519. Starszego typu RSA używaj tylko dla urządzeń, które nie obsługują ed25519, i wtedy z długością -t rsa -b 4096.
  • -C "notebook-jan" – etykieta (komentarz) na końcu klucza publicznego. Na VPS podpowiada, z którego komputera jest klucz. Etykieta niczego nie zabezpiecza; służy tylko orientacji.

Masz już klucz?

Gdy ssh-keygen powie … already exists. Overwrite (y/n)?, odpowiedz n. Nadpisanie oznaczałoby utratę starego klucza i dostępu wszędzie tam, gdzie go używasz. Starego klucza możesz spokojnie użyć także do VPS.

Tworzenie klucza w PuTTYgen#

Jeśli łączysz się przez PuTTY, utwórz klucz w PuTTYgen, który instaluje się razem z PuTTY.

  1. Uruchom PuTTYgen.
  2. W Parameters wybierz typ EdDSA, a obok Ed25519 (255 bits).
  3. Kliknij Generate i poruszaj myszą po pustym obszarze okna, aż pasek postępu się zapełni. Ruch myszy służy jako źródło losowości.
  4. W polu Key comment wpisz etykietę, na przykład notebook-jan.
  5. W polach Key passphrase i Confirm passphrase wpisz hasło klucza.
  6. Kliknij Save private key i zapisz plik, na przykład C:\Users\<USER>\.ssh\vps.ppk. To klucz prywatny.
  7. Zaznacz i skopiuj cały tekst w polu Public key for pasting into OpenSSH authorized_keys file. Zaczyna się od ssh-ed25519 AAAA… i kończy etykietą. To klucz publiczny, który prześlesz na VPS ręcznie (zobacz zakładkę Ręcznie niżej).

Przycisk Save public key zapisuje klucz publiczny w innym formacie, którego VPS nie przyjmie. Zawsze kopiuj tekst z pola.

Przesyłanie klucza publicznego na VPS#

Windows

Windows nie ma polecenia ssh-copy-id. To samo robi to polecenie PowerShell (zamień 203.0.113.10 na adres IP swojego VPS):

PowerShell
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
  • type $env:USERPROFILE\.ssh\id_ed25519.pub – wypisuje zawartość klucza publicznego ($env:USERPROFILE to Twój folder C:\Users\<USER>).
  • | – przekazuje wyjście jako wejście następnego polecenia.
  • ssh [email protected] "…" – łączy się z VPS (pyta o hasło root) i wykonuje polecenia w cudzysłowie.
  • mkdir -p ~/.ssh – tworzy folder .ssh, jeśli jeszcze nie istnieje.
  • chmod 700 ~/.ssh – folder może otworzyć tylko właściciel. SSH odrzuca zbyt szerokie uprawnienia.
  • cat >> ~/.ssh/authorized_keys – dopisuje klucz na koniec pliku. Klucze, które już tam są, zostają.
  • chmod 600 ~/.ssh/authorized_keys – plik może czytać i zmieniać tylko właściciel.

macOS

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
  • ssh-copy-id – przesyła klucz publiczny na serwer i ustawia właściwe uprawnienia.
  • -i ~/.ssh/id_ed25519.pub – który klucz przesłać.
  • [email protected] – użytkownik i adres VPS.

Pyta o hasło root i na końcu wypisuje Number of key(s) added: 1.

Linux

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
  • ssh-copy-id – przesyła klucz publiczny na serwer i ustawia właściwe uprawnienia.
  • -i ~/.ssh/id_ed25519.pub – który klucz przesłać.

Pyta o hasło root i na końcu wypisuje Number of key(s) added: 1.

Ręcznie

Przydatne dla klucza z PuTTYgen albo gdy poprzednie metody nie działają.

  1. Połącz się z VPS hasłem (PuTTY, terminal lub konsola w przeglądarce).

  2. Przygotuj folder i otwórz plik kluczy:

    bash
    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    nano ~/.ssh/authorized_keys
  3. Wklej klucz publiczny w osobnej linii (w PuTTY prawym przyciskiem). Cały klucz musi być w jednej linii: ssh-ed25519 AAAA… komentarz.

  4. Zapisz (Ctrl+O, Enter) i zamknij edytor (Ctrl+X).

  5. Ustaw uprawnienia:

    bash
    chmod 600 ~/.ssh/authorized_keys

Logowanie kluczem#

Klient SSH sam znajduje klucz w domyślnym miejscu (id_ed25519), więc wystarczy zwykłe polecenie:

bash
ssh [email protected]

Jeśli ustawiono hasło klucza, klient pyta Enter passphrase for key. Wpisujesz hasło klucza, nie hasło root.

Klucz zapisany gdzie indziej lub pod inną nazwą wskazujesz opcją -i:

bash
ssh -i ~/.ssh/vps_klic [email protected]
  • -i ~/.ssh/vps_klic – ścieżka do klucza prywatnego (pliku bez .pub).

PuTTY:

  1. Uruchom PuTTY i wczytaj zapisaną sesję (Load) albo wpisz adres IP.
  2. W drzewie po lewej otwórz Connection › SSH › Auth › Credentials.
  3. Obok pola Private key file for authentication kliknij Browse i wybierz plik .ppk.
  4. Opcjonalnie: w Connection › Data wypełnij Auto-login username wartością root.
  5. Wróć do Session, kliknij nazwę sesji i Save, aby następnym razem tego nie ustawiać.
  6. Kliknij Open.

Klucza z ssh-keygen możesz użyć także w PuTTY: w PuTTYgen kliknij Load, wybierz plik id_ed25519 (przełącz filtr plików na All Files) i zapisz go przez Save private key jako .ppk. W drugą stronę klucz z PuTTYgen konwertujesz do formatu OpenSSH przez Conversions › Export OpenSSH key.

ssh-agent: hasło klucza tylko raz#

ssh-agent pamięta odblokowany klucz, więc nie wpisujesz hasła klucza przy każdym połączeniu.

Windows

W PowerShell uruchomionym jako administrator włącz usługę agenta (domyślnie jest wyłączona):

PowerShell
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
  • Set-Service -StartupType Automatic – agent startuje razem z systemem.
  • Start-Service ssh-agent – uruchamia agenta teraz.

Następnie dodaj klucz w zwykłym oknie (pyta o hasło klucza):

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

macOS

bash
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
  • --apple-use-keychain – zapisuje hasło klucza w pęku kluczy macOS (Keychain).

Aby SSH używał hasła z pęku kluczy automatycznie także po restarcie Maca, dodaj na początek pliku ~/.ssh/config (zobacz następną sekcję):

~/.ssh/configtext
Host *
    UseKeychain yes
    AddKeysToAgent yes
  • UseKeychain yes – hasło klucza jest wczytywane z pęku kluczy (tylko macOS).
  • AddKeysToAgent yes – odblokowany klucz jest dodawany do agenta przy pierwszym użyciu.

Linux

Większość środowisk graficznych uruchamia agenta sama. Dodaj klucz przez:

bash
ssh-add ~/.ssh/id_ed25519

Kontrola: ssh-add -l wypisuje odciski kluczy wczytanych przez agenta.

Plik ~/.ssh/config: połączenie jednym słowem#

Zapisz ustawienia swojego VPS w pliku config w folderze .ssh (Windows: C:\Users\<USER>\.ssh\config, bez rozszerzenia):

~/.ssh/configtext
Host mojevps
    HostName 203.0.113.10
    User root
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
DyrektywaCo robi
Host mojevpsSkrót, który wpiszesz zamiast adresu. Dotyczy linii pod nim.
HostNamePrawdziwy adres IP lub domena VPS.
UserUżytkownik, jako który się logujesz.
PortPort SSH. Zmień, jeśli przeniesiono SSH na inny port.
IdentityFileKlucz prywatny dla tego VPS.
IdentitiesOnly yesPróbuj tylko klucza z IdentityFile, nie wszystkich kluczy z agenta. Zapobiega błędowi Too many authentication failures.

Potem łączysz się przez ssh mojevps. Skrótu używają także scp i sftp.

Wyłączanie logowania hasłem#

Dopóki logowanie hasłem jest włączone, boty mogą go dalej próbować. Po wyłączeniu VPS przyjmuje tylko klucz.

Na co w strefie klienta wpływa wyłączenie haseł

Zakładki Pliki i Baza danych logują się do VPS hasłem. Po wyłączeniu haseł przestają działać. Pliki przesyłaj wtedy klientem SFTP z kluczem (zarówno WinSCP, jak i FileZilla obsługują klucze), a bazą danych zarządzaj przez tunel SSH. Konsola w przeglądarce działa dalej. Przegląd wszystkich skutków znajdziesz w poradniku Zabezpieczenie nowego VPS.

Najpierw sprawdź, że logowanie kluczem działa

Jeśli wyłączysz hasła, a klucz nie zadziała, nie zalogujesz się przez SSH. Zanim przejdziesz dalej, otwórz nowe okno i zaloguj się kluczem bez wpisywania hasła root. Pierwotne okno zostaw cały czas otwarte. Jeśli mimo to coś pójdzie nie tak, zaloguj się przez konsolę w przeglądarce hasłem root i usuń plik z kroku 1.

  1. Utwórz (lub otwórz) własny plik konfiguracyjny serwera SSH:

    bash
    nano /etc/ssh/sshd_config.d/00-zabezpeceni.conf
  2. Wklej ustawienia:

    /etc/ssh/sshd_config.d/00-zabezpeceni.confini
    PasswordAuthentication no
    KbdInteractiveAuthentication no
    PubkeyAuthentication yes
    PermitRootLogin prohibit-password

    Jeśli plik ma już PermitRootLogin no (z poradnika Zabezpieczenie nowego VPS), pomiń ostatnią linię.

    UstawienieCo robiZalecana wartośćKiedy zmieniać
    PasswordAuthenticationZezwala na logowanie hasłem.noNigdy, jeśli hasła mają być wyłączone.
    KbdInteractiveAuthenticationInny sposób wpisywania hasła (interaktywny monit). Nawet przy wyłączonym PasswordAuthentication dałoby się przez niego wpisać hasło.noyes tylko dla uwierzytelniania dwuskładnikowego przez PAM (zaawansowane).
    PubkeyAuthenticationZezwala na logowanie kluczem. Wartość domyślna to yes; podajemy ją dla pewności.yesNigdy.
    PermitRootLoginLogowanie roota. prohibit-password = root tylko kluczem.prohibit-passwordno, jeśli pracujesz pod własnym użytkownikiem z sudo.
  3. Zapisz i zamknij edytor.

  4. Sprawdź, że obowiązują dokładnie Twoje wartości:

    bash
    sshd -t && sshd -T | grep -Ei "^(passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|permitrootlogin)"
    • sshd -t – sprawdza składnię konfiguracji. Przy błędzie wypisuje plik i linię, a następne polecenie się nie uruchamia.
    • sshd -T – wypisuje wynikową obowiązującą konfigurację po wczytaniu wszystkich plików.
    • grep -Ei "…" – wybiera tylko cztery sprawdzane ustawienia.

    Wyjście musi zawierać te cztery linie (kolejność może się różnić):

    Wyniktext
    permitrootlogin without-password
    pubkeyauthentication yes
    passwordauthentication no
    kbdinteractiveauthentication no

    without-password to starsza nazwa prohibit-password i oznacza to samo. Ubuntu 24.04 i Debian 13 wypisują starszą nazwę; nowsze wersje OpenSSH wypisują prohibit-password. Jeśli ustawiono no, zobaczysz permitrootlogin no.

    Jeśli któraś linia pokazuje inną wartość (zwykle passwordauthentication yes), to samo ustawienie jest w pliku wczytywanym wcześniej. Znajdź go przez grep -rni "passwordauthentication" /etc/ssh/sshd_config.d/. Zakomentuj tam linię znakiem # na początku i powtórz kontrolę.

  5. Zrestartuj serwer SSH:

    bash
    systemctl restart ssh

    Bieżące połączenie pozostaje otwarte.

  6. W nowym oknie spróbuj wymusić logowanie hasłem:

    bash
    ssh -o PubkeyAuthentication=no [email protected]

    Serwer musi odpowiedzieć Permission denied (publickey). To poprawne: nie przyjmuje już haseł.

  7. W kolejnym oknie zaloguj się normalnie kluczem (ssh [email protected]). Dopiero gdy to działa, zamknij pierwotne okno.

Dlaczego plik 00-⁠zabezpeceni.conf

Serwer SSH najpierw czyta pliki w folderze /etc/ssh/sshd_config.d/ (w kolejności alfabetycznej), a potem główny /etc/ssh/sshd_config. Dla każdego ustawienia obowiązuje pierwsza znaleziona wartość. VPS może mieć plik typu 50-cloud-init.conf z PasswordAuthentication yes. Dzięki numerowi 00 Twój plik wczytuje się pierwszy i jego wartości wygrywają. Kontrola sshd -T zawsze Ci to potwierdzi.

Kilka komputerów, usuwanie i kopia zapasowa klucza#

  • Kolejny komputer: utwórz mu własny klucz z inną etykietą i prześlij go tak samo. Każdy klucz jest w osobnej linii ~/.ssh/authorized_keys. Nie zalecamy kopiowania jednego klucza prywatnego między komputerami.
  • Usunięcie klucza (zgubiony laptop, odchodzący współpracownik): otwórz nano ~/.ssh/authorized_keys i usuń linię z jego etykietą. Działa natychmiast.
  • Kopia zapasowa: przechowuj klucz prywatny w menedżerze haseł lub na zaszyfrowanym nośniku. Jeśli go zgubisz, a hasła są wyłączone, zaloguj się przez konsolę w przeglądarce i prześlij nowy klucz publiczny.
  • Użytkownik inny niż root: klucz trafia do /home/<USER>/.ssh/authorized_keys, a plik musi należeć do tego użytkownika.

Weryfikacja#

  • ssh root@<ADRES_IP_VPS> loguje bez hasła root (najwyżej pyta o hasło klucza).
  • ssh -o PubkeyAuthentication=no root@<ADRES_IP_VPS> kończy się Permission denied (publickey).
  • sshd -T pokazuje passwordauthentication no.

Rozwiązywanie problemów#

VPS nadal pyta o hasło root#

Klucz nie został użyty. Połącz się ze szczegółowym wyjściem:

bash
ssh -v [email protected]
  • -v – szczegółowe wyjście. Szukaj linii Offering public key (klient zaoferował klucz) i Server accepts key (serwer go przyjął).

Jeśli klient nie oferuje klucza, jest w innym pliku: użyj -i lub IdentityFile. Jeśli serwer go nie przyjmuje, sprawdź uprawnienia na VPS:

bash
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
journalctl -u ssh -n 30
  • journalctl -u ssh -n 30 – ostatnie 30 wpisów serwera SSH. Komunikat Authentication refused: bad ownership or modes oznacza złe uprawnienia lub złego właściciela folderu .ssh.

Sprawdź też, czy klucz w authorized_keys jest w jednej linii i zaczyna się od ssh-ed25519.

Permission denied (publickey).#

Hasła są wyłączone, a serwer nie przyjął klucza. Postępuj jak w poprzednim punkcie. Jeśli w ogóle nie możesz się zalogować, użyj konsoli w przeglądarce.

Windows: WARNING: UNPROTECTED PRIVATE KEY FILE! lub Bad permissions#

Inni użytkownicy komputera też mają dostęp do klucza prywatnego (zwykle po skopiowaniu go skądinąd) i klient odmawia jego użycia. Ustaw uprawnienia w PowerShell:

PowerShell
icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r
icacls $env:USERPROFILE\.ssh\id_ed25519 /grant:r "$($env:USERNAME):(R)"
  • /inheritance:r – usuwa uprawnienia dziedziczone z folderu.
  • /grant:r "<USER>:(R)" – daje uprawnienie do odczytu tylko Twojemu kontu.

W macOS i Linux ten sam błąd naprawisz przez chmod 600 ~/.ssh/id_ed25519.

Load key "…": invalid format#

Próbujesz użyć klucza w formacie PuTTY (.ppk) z OpenSSH. Przekonwertuj go w PuTTYgen przez Conversions › Export OpenSSH key.

PuTTY: Server refused our key#

Na VPS nie ma właściwego klucza publicznego. Skopiuj ponownie tekst z pola Public key for pasting into OpenSSH authorized_keys file (nie plik z Save public key) i wklej go do ~/.ssh/authorized_keys w jednej linii.

Too many authentication failures#

Agent oferuje za dużo kluczy. Użyj IdentitiesOnly yes w ~/.ssh/config albo opcji -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes.

Podsumowanie

  • Klucz prywatny zostaje tylko na Twoim komputerze; klucz publiczny trafia do ~/.ssh/authorized_keys na VPS.
  • Klucz utwórz przez ssh-keygen -t ed25519 -C "komentarz" albo w PuTTYgen (EdDSA, Ed25519).
  • Przesyłanie: ssh-copy-id (macOS, Linux), w Windows type … | ssh …, albo ręcznie.
  • Hasła wyłącz plikiem /etc/ssh/sshd_config.d/00-zabezpeceni.conf i sprawdź wynik przez sshd -T.
  • Przed zamknięciem pierwotnego okna zawsze przetestuj logowanie kluczem w nowym oknie.
  • Wyłączenie haseł wyłącza też zakładki Pliki i Baza danych; konsola działa dalej.

Wyszukiwanie w poradnikach