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żą:
| Plik | Przykładowa nazwa | Gdzie jest | Komu go dać |
|---|---|---|---|
| Klucz prywatny | id_ed25519 (PuTTY: .ppk) | Tylko na Twoim komputerze. | Nikomu. Kto go ma, może logować się jako Ty. |
| Klucz publiczny | id_ed25519.pub | Na 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
Otwórz Terminal (prawym przyciskiem Start › Terminal; w Windows 10 Windows PowerShell).
Uruchom:
PowerShell ssh-keygen -t ed25519 -C "notebook-jan"Przy pytaniu
Enter file in which to save the key (C:\naciśnij Enter. Klucz zapisze się w domyślnym miejscu, gdzie SSH sam go znajdzie.Users\ jan/ .ssh/ id_ ed25519): Przy
Enter passphrasewpisz hasło klucza i naciśnij Enter. PrzyEnter same passphrase againpowtórz je. Hasło się nie wyświetla. Jeśli zostawisz je puste, klucz nie będzie zabezpieczony.
Wynik: pliki C:\ (prywatny) i id_ed25519.pub (publiczny).
macOS
Otwórz aplikację Terminal.
Uruchom:
bash ssh-keygen -t ed25519 -C "macbook-jan"Przy pytaniu
Enter file in which to save the keynaciśnij Enter.Wpisz i powtórz hasło klucza (passphrase).
Wynik: ~/.ssh/id_ed25519 i ~/.ssh/id_ed25519.pub.
Linux
Otwórz terminal.
Uruchom:
bash ssh-keygen -t ed25519 -C "pc-jan"Przy pytaniu
Enter file in which to save the keynaciśnij Enter.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.
- Uruchom PuTTYgen.
- W Parameters wybierz typ EdDSA, a obok Ed25519 (255 bits).
- 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.
- W polu Key comment wpisz etykietę, na przykład
notebook-jan. - W polach Key passphrase i Confirm passphrase wpisz hasło klucza.
- Kliknij Save private key i zapisz plik, na przykład
C:\. To klucz prywatny.Users\ <USER>\ .ssh\ vps. ppk - 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):
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:– wypisuje zawartość klucza publicznego (USERPROFILE\ .ssh\ id_ ed25519. pub $env:USERPROFILEto Twój folderC:\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
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
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ą.
Połącz się z VPS hasłem (PuTTY, terminal lub konsola w przeglądarce).
Przygotuj folder i otwórz plik kluczy:
bash mkdir -p ~/.ssh && chmod 700 ~/.ssh nano ~/.ssh/authorized_keysWklej klucz publiczny w osobnej linii (w PuTTY prawym przyciskiem). Cały klucz musi być w jednej linii:
ssh-ed25519 AAAA… komentarz.Zapisz (Ctrl+O, Enter) i zamknij edytor (Ctrl+X).
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:
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:
ssh -i ~/.ssh/vps_klic [email protected]-i ~/.ssh/vps_klic– ścieżka do klucza prywatnego (pliku bez.pub).
PuTTY:
- Uruchom PuTTY i wczytaj zapisaną sesję (Load) albo wpisz adres IP.
- W drzewie po lewej otwórz Connection › SSH › Auth › Credentials.
- Obok pola Private key file for authentication kliknij Browse i wybierz plik
.ppk. - Opcjonalnie: w Connection › Data wypełnij Auto-login username wartością
root. - Wróć do Session, kliknij nazwę sesji i Save, aby następnym razem tego nie ustawiać.
- 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):
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agentSet-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):
ssh-add $env:USERPROFILE\.ssh\id_ed25519macOS
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ę):
Host *
UseKeychain yes
AddKeysToAgent yesUseKeychain 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:
ssh-add ~/.ssh/id_ed25519Kontrola: 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:\, bez rozszerzenia):
Host mojevps
HostName 203.0.113.10
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes| Dyrektywa | Co robi |
|---|---|
Host mojevps | Skrót, który wpiszesz zamiast adresu. Dotyczy linii pod nim. |
HostName | Prawdziwy adres IP lub domena VPS. |
User | Użytkownik, jako który się logujesz. |
Port | Port SSH. Zmień, jeśli przeniesiono SSH na inny port. |
IdentityFile | Klucz prywatny dla tego VPS. |
IdentitiesOnly yes | Pró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.
Utwórz (lub otwórz) własny plik konfiguracyjny serwera SSH:
bash nano /etc/ssh/sshd_config.d/00-zabezpeceni.confWklej ustawienia:
/etc/ ssh/ inisshd_config.d/ 00-zabezpeceni.conf PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes PermitRootLogin prohibit-passwordJeśli plik ma już
PermitRootLogin no(z poradnika Zabezpieczenie nowego VPS), pomiń ostatnią linię.Ustawienie Co robi Zalecana 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 PasswordAuthenticationdałoby się przez niego wpisać hasło.noyestylko 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 zsudo.Zapisz i zamknij edytor.
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 nowithout-passwordto starsza nazwaprohibit-passwordi oznacza to samo. Ubuntu 24.04 i Debian 13 wypisują starszą nazwę; nowsze wersje OpenSSH wypisująprohibit-password. Jeśli ustawionono, zobaczyszpermitrootlogin no.Jeśli któraś linia pokazuje inną wartość (zwykle
passwordauthentication yes), to samo ustawienie jest w pliku wczytywanym wcześniej. Znajdź go przezgrep -rni "passwordauthentication" /etc/ssh/sshd_config.d/. Zakomentuj tam linię znakiem#na początku i powtórz kontrolę.Zrestartuj serwer SSH:
bash systemctl restart sshBieżące połączenie pozostaje otwarte.
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ł.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_keysi 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/, a plik musi należeć do tego użytkownika.<USER>/ .ssh/ authorized_ keys
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 -Tpokazujepasswordauthentication 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:
ssh -v [email protected]-v– szczegółowe wyjście. Szukaj liniiOffering public key(klient zaoferował klucz) iServer 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:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
journalctl -u ssh -n 30journalctl -u ssh -n 30– ostatnie 30 wpisów serwera SSH. KomunikatAuthentication refused: bad ownership or modesoznacza 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:
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_keysna VPS. - Klucz utwórz przez
ssh-keygen -t ed25519 -C "komentarz"albo w PuTTYgen (EdDSA, Ed25519). - Przesyłanie:
ssh-copy-id(macOS, Linux), w Windowstype … | ssh …, albo ręcznie. - Hasła wyłącz plikiem
/etc/i sprawdź wynik przezssh/ sshd_ config. d/ 00-zabezpeceni. conf 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.