ssh-keygen: tworzenie kluczy SSH, rejestracja klucza publicznego i ssh-copy-id

Środowisko testoweRodzina RHELAlmaLinux 9.8konto rootSprawdzono 2026-11-05
Polecenia sieciowessh-keygenssh-copy-idLokalizacja/usr/bin/ssh-keygen

ssh-keygen to polecenie OpenSSH, które tworzy parę klucza prywatnego i publicznego do połączeń SSH, a do tego sprawdza odciski, zmienia hasło klucza i porządkuje known_hosts. Na serwerze AlmaLinux 9 utworzono klucze ed25519 i rsa, sprawdzono ich odciski, zmieniono hasło klucza i komentarz, a potem uruchomiono ssh-copy-id w trybie dry-run: na serwer trafia tylko jedna linia klucza publicznego z pliku .pub.

Nazwy kont i ścieżki plików kluczy w wynikach poniżej to przykładowe wartości, a odciski, klucze publiczne i randomart pochodzą z kluczy utworzonych na potrzeby tego artykułu i potem usuniętych. Polecenie, które naprawdę rejestruje klucz publiczny na serwerze, jest tylko zapisane, nie zostało uruchomione.

1️⃣ Tworzenie klucza w ssh-keygen: -t ed25519 i komentarz -C

Klucz tworzysz w formie ssh-keygen -t typ -C komentarz. -t to typ klucza, a -C to komentarz dopisywany na końcu klucza publicznego, w którym wpisujesz adres e-mail albo przeznaczenie klucza. Poniżej pełny wynik z plikiem wskazanym przez -f i dwukrotnym naciśnięciem Enter przy pytaniach o hasło klucza.

ssh-keygen -t ed25519 -C "user@example.com" -f ~/.ssh/id_ed25519
Generating public/private ed25519 key pair.
Enter passphrase for "/home/user/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|     .           |
|    o o          |
|     = o   .     |
|    =   Soo .    |
|     = *+*.. .   |
|    o.B.o++ .    |
|    .=o*Eo.+     |
|    o+=@OO=      |
+----[SHA256]-----+

Jeśli przy pytaniu o hasło klucza naciśniesz tylko Enter, klucz będzie bez hasła. Gdy pominiesz -f, przed tym pytaniem pojawi się linia z pytaniem, gdzie zapisać plik. W nawiasie widać domyślną ścieżkę .ssh/id_ed25519 w katalogu domowym i samo Enter zapisuje klucz właśnie tam.

randomart na końcu wyniku to odcisk zamieniony na obrazek. Ten sam obrazek pojawił się przy tworzeniu klucza i przy ponownym sprawdzeniu przez -lv.

ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
-rw------- 1 user user 411 Oct 29 08:22 /home/user/.ssh/id_ed25519
-rw-r--r-- 1 user user  98 Oct 29 08:22 /home/user/.ssh/id_ed25519.pub

Klucz prywatny powstał z uprawnieniami 600, a publiczny z 644. Klucz prywatny trzymasz tylko na swoim komputerze i nigdzie go nie wysyłasz.

cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com

Klucz publiczny to jedna linia złożona z typu klucza, wartości klucza i komentarza rozdzielonych spacjami. To właśnie ta linia trafia do authorized_keys na serwerze, z którym się łączysz. Rolę każdego pliku w katalogu zebrano w drzewie.

~/.sshKatalog z kluczami i zapisami połączeń · uprawnienia 700
id_ed25519Klucz prywatny · plik tylko na twoim komputerze · uprawnienia 600
id_ed25519.pubJedna linia klucza publicznego · trafia do authorized_keys na serwerze docelowym · uprawnienia 644
authorized_keysLista kluczy publicznych, które mogą logować się na ten serwer (leży na serwerze odbierającym)
known_hostsKlucze hosta serwerów, z którymi się łączono · ssh-keygen -R usuwa je linia po linii
configAlias, port i plik klucza dla każdego serwera (ssh_config)

2️⃣ Opcje ssh-keygen: -f, -N, -b, -q

Odpowiadanie na pytania jest wygodne przy ręcznym wpisywaniu, ale w skrypcie pytania muszą zniknąć. Gdy ustawisz plik przez -f, a hasło klucza przez -N, klucz powstaje od razu, bez pytań.

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N "" -C "deploy@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/deploy_key
Your public key has been saved in /home/user/.ssh/deploy_key.pub
The key fingerprint is:
SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com
The key's randomart image is:
+--[ED25519 256]--+
|        +        |
|       o +       |
|        +    .   |
|       . +  o    |
|    . o S ++o    |
|   . + +   B+    |
|  .oo * + .=+    |
|  E+o* Boo=++.   |
|   .=.=oo=o++.   |
+----[SHA256]-----+

Puste cudzysłowy po -N dają klucz bez hasła, a miejsce zapisu i odcisk pojawiły się za jednym razem, bez żadnego pytania.

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""
Generating public/private ed25519 key pair.
/home/user/.ssh/deploy_key already exists.
Overwrite (y/n)?

Po ponownym uruchomieniu z tą samą nazwą polecenie po already exists pyta, czy nadpisać plik. Po wpisaniu n nic się nie zmieniło, a polecenie zakończyło się kodem wyjścia 1. Żeby przez pomyłkę nie nadpisać używanego klucza, nowe klucze twórz pod inną nazwą.

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "user@example.com"
Generating public/private rsa key pair.
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:f+uwCSQjMka1BEHzXADwIWbrlbVRiP6Z4tjnwNwPVAA user@example.com
The key's randomart image is:
+---[RSA 4096]----+
|o=BE*=+.         |
|oo.Oo++          |
| .+o+. .         |
|....  .          |
| .+ o.= S        |
| .o+o= + .       |
|  ++.o  . o .    |
| . o..o  . = .   |
|    o. .  o.o    |
+----[SHA256]-----+

Dla rsa długość ustawia -b. Według podręcznika domyślnie to 3072 bity; powyżej klucz utworzono z 4096 bitami i w nagłówku randomart pojawiło się RSA 4096. Podręcznik podaje, że ed25519 ma stałą długość, więc -b jest wtedy pomijane.

ssh-keygen -f ~/.ssh/default_key -N "" -C "user@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/default_key
Your public key has been saved in /home/user/.ssh/default_key.pub
The key fingerprint is:
SHA256:mwy02fpKxjxEVvLC2EUJeaMIiNFOVS0GwWVjN9v0j4c user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|o+ o+=O=*..      |
|o + .*+B== .     |
| o ..oB+o.. .    |
|  . .+.=     +   |
|      = S   E o  |
|     + + o   .   |
|      B +        |
|     o o         |
|      ...        |
+----[SHA256]-----+

Bez -t powstał klucz ed25519.

ssh-keygen -q -t ed25519 -f ~/.ssh/backup_key -N "" -C "backup@example.com"; echo rc=$?
rc=0

Z -q ukryte jest wszystko, łącznie z odciskiem i randomart, i zostaje tylko kod wyjścia. Przydaje się, gdy skrypt tworzy klucze dla wielu serwerów.

📌 Główne opcje: wyniki z tego artykułu

OpcjaZadanieWynik w tym artykule
-t typTyp tworzonego kluczaPierwsza linia wyniku pokazuje typ, np. ed25519 lub rsa; bez opcji ed25519
-C komentarzKomentarz dopisywany na końcu klucza publicznegouser@example.com na końcu klucza publicznego wyświetlonego przez cat
-f plikŚcieżka pliku kluczaLinia o zapisie w /home/user/.ssh/deploy_key; ponownie z tą samą nazwą already exists i Overwrite (y/n)?
-N hasłoNowe hasło klucza (passphrase); puste cudzysłowy oznaczają brak hasłaMiejsce zapisu i odcisk za jednym razem, bez pytania o hasło
-b bityDługość kluczaZ 4096 dla rsa w nagłówku randomart widać RSA 4096
-qUkrywa cały wynikZostaje tylko linia rc=0 wypisana przez echo
-lWypisuje odcisk pliku kluczaTen sam odcisk SHA256 z klucza publicznego i prywatnego; dla authorized_keys jedna linia na klucz
-E skrótUstawia typ skrótu odciskuZ -E md5 odcisk zaczynający się od MD5:00:7b:02:5e
-vRazem z -l wypisuje też randomartTen sam randomart co przy tworzeniu klucza
-yWyciąga z klucza prywatnego klucz publiczny i go wypisujeJedna linia klucza publicznego identyczna znak w znak z plikiem .pub
-pZmienia hasło klucza prywatnegoPojawia się linia o zapisie z nowym hasłem, a klucz prywatny rośnie z 411 do 464 bajtów
-P hasłoStare hasło klucza (obecnie ustawione)Przy dobrym haśle klucz publiczny, przy złym incorrect passphrase supplied to decrypt private key
-cZmienia komentarz; nowy podajesz przez -COld comment: user@example.com oraz Comment 'user@laptop' applied
-F hostSzuka linii tego hosta w known_hosts# Host 192.0.2.10 found: line 1 i sama linia
-R hostUsuwa linię tego hosta z known_hostsknown_hosts updated i oryginalny plik known_hosts.old; nieznany host daje not found
-HHaszuje nazwy hostów i adresy w known_hostsLinie zaczynające się od |1| oraz WARNING, że plik .old zawiera linie bez haszowania

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
-a rundyLiczba rund KDF (bcrypt_pbkdf) przy zapisie klucza prywatnego; im więcej, tym wolniejsze sprawdzanie hasła i większa odporność na brute force; domyślnie 16
-ATworzy brakujące klucze hosta dla każdego domyślnego typu (rsa, ecdsa, ed25519) w domyślnych ścieżkach
-BWypisuje skrót bubblebabble pliku klucza
-eZamienia klucz OpenSSH na format -m (domyślnie RFC4716) i go wypisuje, dla innych programów SSH
-iZamienia klucz bez hasła w formacie -m (domyślnie RFC4716) na format OpenSSH i go wypisuje
-m formatUstawia format klucza (RFC4716, PKCS8, PEM); razem z -p zamienia klucze prywatne między formatami OpenSSH i PEM
-r hostWypisuje z klucza publicznego rekord DNS SSHFP dla tej nazwy hosta
-s klucz_CAPodpisuje klucz publiczny kluczem CA i tworzy certyfikat
-LWypisuje zawartość certyfikatu
-KPobiera do bieżącego katalogu klucze resident zapisane w uwierzytelniaczu FIDO
-Y signPodpisuje plik kluczem SSH; podpis zapisuje się z .sig na końcu nazwy pliku, a przestrzeń nazw podajesz przez -n

3️⃣ ssh-keygen -l do sprawdzania odcisku i -y do wyciągania klucza publicznego

Gdy plików kluczy jest kilka, po samej nazwie trudno poznać, który klucz publiczny pasuje do którego prywatnego. Odcisk jest taki sam dla klucza prywatnego i publicznego, więc porównując przez -l odciski obu plików, potwierdzisz parę.

ssh-keygen -l -f ~/.ssh/id_ed25519.pub
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)
ssh-keygen -l -f ~/.ssh/id_ed25519
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)

Plik klucza publicznego i plik klucza prywatnego dały ten sam odcisk SHA256. 256 na początku to długość klucza, a nawias na końcu to typ klucza.

ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub
256 MD5:00:7b:02:5e:b8:ba:85:0c:32:d7:15:7e:72:45:f7:bc user@example.com (ED25519)

Z -E md5 wynik przechodzi na starszy format odcisku MD5. Przydaje się do porównania, gdy stary serwer albo panel administracyjny pokazuje odciski MD5.

ssh-keygen -lv -f ~/.ssh/id_ed25519.pub
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)
+--[ED25519 256]--+
|                 |
|     .           |
|    o o          |
|     = o   .     |
|    =   Soo .    |
|     = *+*.. .   |
|    o.B.o++ .    |
|    .=o*Eo.+     |
|    o+=@OO=      |
+----[SHA256]-----+

Po dodaniu -v randomart pojawia się znowu. Był to ten sam obrazek co przy tworzeniu klucza.

ssh-keygen -l -f ~/.ssh/authorized_keys
256 SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com (ED25519)

Gdy podasz plik z wieloma liniami kluczy publicznych, na przykład authorized_keys, dostaniesz jedną linię odcisku na każdy klucz. Tak sprawdzisz, jakie klucze są zarejestrowane na serwerze.

ssh-keygen -y -f ~/.ssh/id_ed25519
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com

-y ponownie wyciąga klucz publiczny z prywatnego. Jeśli usunięto plik .pub albo na inny komputer przeniesiono tylko klucz prywatny, wystarczy zapisać ten wynik do pliku. Wynik był identyczny znak w znak z oryginalnym plikiem .pub.

4️⃣ ssh-keygen -p do zmiany hasła klucza i -c do zmiany komentarza

Z hasłem na kluczu prywatnym pliku nie da się użyć bez tego hasła, nawet jeśli wycieknie. W zamian trzeba je wpisywać przy każdym połączeniu, więc pasuje do kluczy używanych ręcznie przez ludzi, a nie do kluczy skryptów działających samodzielnie, jak zadania cron.

ssh-keygen -p -f ~/.ssh/id_ed25519 -P "" -N "example-pass"
Key has comment 'user@example.com'
Your identification has been saved with the new passphrase.

-P to stare hasło klucza, a -N nowe. Klucz nie miał hasła, więc -P dostało puste cudzysłowy i pojawiły się dwie linie o ponownym zapisie z nowym hasłem. Według podręcznika samo -p bez opcji pyta po kolei o stare i nowe hasło.

ls -l ~/.ssh/id_ed25519
-rw------- 1 user user 464 Oct 29 08:22 /home/user/.ssh/id_ed25519

Po ustawieniu hasła plik klucza prywatnego urósł z 411 do 464 bajtów.

ssh-keygen -y -f ~/.ssh/id_ed25519 -P "example-pass"
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com
ssh-keygen -y -f ~/.ssh/id_ed25519 -P "wrongpass"
Load key "/home/user/.ssh/id_ed25519": incorrect passphrase supplied to decrypt private key

Przy kluczu z hasłem także -y potrzebuje hasła podanego przez -P. Z dobrym hasłem wyszedł ten sam klucz publiczny co wcześniej, a ze złym polecenie zakończyło się błędem incorrect passphrase. Podręcznik wyjaśnia, że zgubionego hasła nie da się odzyskać, więc jeśli je zapomnisz, utwórz nowy klucz i zarejestruj klucz publiczny od nowa.

ssh-keygen -c -C "user@laptop" -f ~/.ssh/id_ed25519 -P "example-pass"
Old comment: user@example.com
Comment 'user@laptop' applied
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@laptop

-c zmienia komentarz. Stary i nowy komentarz pojawiają się w osobnych liniach, a komentarz na końcu pliku klucza publicznego też zmienił się na user@laptop. Komentarz to tylko etykieta do rozróżniania kluczy, więc sama wartość klucza się nie zmieniła.

ssh-keygen -p -f ~/.ssh/id_ed25519 -P "example-pass" -N ""
Key has comment 'user@laptop'
Your identification has been saved with the new passphrase.

Aby usunąć hasło, podaj -N puste cudzysłowy. Pojawiają się te same dwie linie, a potem -y znowu zadziałało bez -P.

5️⃣ ssh-keygen -R: usuwanie kluczy hosta z known_hosts

W known_hosts zbierają się klucze hosta serwerów, z którymi się łączono, po jednym w linii. Gdy serwer zostanie przeinstalowany i jego klucz hosta się zmieni, ssh odrzuca połączenie, bo klucz różni się od zapisanego, a opcja usuwająca starą linię to -R. known_hosts poniżej to plik z trzema liniami z przykładowymi adresami, wskazany przez -f.

cat ~/.ssh/known_hosts
192.0.2.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk
server2.example.com,192.0.2.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
[192.0.2.30]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0WmcBD2HIsiSn+tERrbeFIyExAodSEUhE9j5WMpkRW

Każda linia zawiera kolejno nazwę hosta lub adres, typ klucza i wartość klucza. Druga linia, połączona przecinkiem, zawiera nazwę i adres tego samego serwera, a nawiasy kwadratowe z dwukropkiem w trzeciej linii oznaczają port inny niż 22.

ssh-keygen -F 192.0.2.10 -f ~/.ssh/known_hosts
# Host 192.0.2.10 found: line 1
192.0.2.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk

-F wypisuje linię tego hosta razem z jej numerem. Dla nieznanego hosta nic nie wypisało i zakończyło się kodem wyjścia 1.

ssh-keygen -R 192.0.2.10 -f ~/.ssh/known_hosts
# Host 192.0.2.10 found: line 1
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
cat ~/.ssh/known_hosts
server2.example.com,192.0.2.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
[192.0.2.30]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0WmcBD2HIsiSn+tERrbeFIyExAodSEUhE9j5WMpkRW

-R usuwa linię tego hosta i zostawia oryginalny plik jako known_hosts.old. Po usunięciu zostały tylko dwie linie.

ssh-keygen -R 192.0.2.99 -f ~/.ssh/known_hosts
Host 192.0.2.99 not found in /home/user/.ssh/known_hosts
ssh-keygen -R "[192.0.2.30]:2222" -f ~/.ssh/known_hosts
# Host [192.0.2.30]:2222 found: line 2
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old

Dla nieznanego hosta pojawiła się tylko jedna linia not found. Serwer na innym porcie znajdziesz tylko wtedy, gdy podasz nawiasy kwadratowe i port dokładnie tak, jak zapisano je w known_hosts.

ssh-keygen -H -f ~/.ssh/known_hosts
WARNING: /home/user/.ssh/known_hosts.old contains unhashed entries
Delete this file to ensure privacy of hostnames
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
cat ~/.ssh/known_hosts
|1|JL/knNlx/BnCoOWp5rNeRo3r1rE=|OCPyeFd1rgG8P2QGzrju/V2Y8c4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
|1|AG9QJQvGaQmVsEusSdND1lM9cKI=|Ue0a9suJIzN0yxoJgV7ClLBgSYw= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR

-H haszuje nazwy hostów i adresy. Ta opcja sprawia, że wyciek pliku nie zdradza, z jakimi serwerami się łączono; nazwa i adres połączone przecinkiem rozdzieliły się na dwie zahaszowane linie. Pojawiło się też ostrzeżenie, że plik .old nadal zawiera treść bez haszowania.

ssh-keygen -F server2.example.com -f ~/.ssh/known_hosts
# Host server2.example.com found: line 1
|1|JL/knNlx/BnCoOWp5rNeRo3r1rE=|OCPyeFd1rgG8P2QGzrju/V2Y8c4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR

Nawet w zahaszowanym pliku -F znalazło linię po nazwie.

6️⃣ ssh-copy-id: rejestracja klucza publicznego i authorized_keys

Samo utworzenie klucza nie wystarczy: dopóki serwer nie zna klucza publicznego, logujesz się dalej hasłem do konta. Miejscem, w którym serwer poznaje klucz publiczny, jest ~/.ssh/authorized_keys konta, na które się logujesz, a ssh-copy-id to polecenie, które dopisuje do tego pliku linię z .pub. Klucz prywatny zostaje na twoim komputerze, a na serwer przechodzi tylko linia klucza publicznego. Kliknij przyciski kroków na diagramie poniżej, aby zobaczyć, gdzie trafiają oba pliki.

🔐 Jak para kluczy z ssh-keygen służy do logowania
Diagram objaśniający
🔍 Kroki
$ ssh-keygen -t ed25519 -C user@example.comssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.0.2.10ssh -i ~/.ssh/id_ed25519 user@192.0.2.10
💻 Mój komputer ~/.ssh
🔒id_ed25519Klucz prywatny · nigdy nie wychodzi na zewnątrz
🔑id_ed25519.pubJedna linia klucza publicznego · kopiowana na serwer
➜Jeszcze nie ma go na serwerzeSkopiowano jedną linię klucza publicznegoSerwer sprawdza kluczem publicznym
🖥️ Serwer ~/.ssh/authorized_keys
📄PustoLogowanie tylko hasłem
🔑ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.comZarejestrowany klucz publiczny · wpuszcza tylko klucz prywatny z pary z tą linią
ssh-keygen tworzy klucz prywatny i publiczny jako parę. Klucz prywatny zostaje tylko w ~/.ssh na twoim komputerze, a publiczny to jedna linia w pliku .pub. Na tym etapie na serwerze jeszcze nic nie ma, więc logujesz się tylko hasłem.
ssh-copy-id dopisuje linię klucza publicznego na końcu ~/.ssh/authorized_keys na serwerze. Klucz prywatny nie jest kopiowany. Klucz publiczny nie musi być tajny, więc tę samą linię możesz dodać na wielu serwerach.
Przy połączeniu serwer sprawdza kluczem publicznym z authorized_keys podpis twojego klucza prywatnego. Jeśli para się zgadza, logujesz się bez hasła; na komputerze bez pliku klucza prywatnego nawet na to samo konto pojawi się pytanie o hasło.
ssh-copy-id -n -i ~/.ssh/deploy_key.pub -o ConnectTimeout=3 user@192.0.2.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/deploy_key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: ssh: connect to host 192.0.2.10 port 22: Connection timed out

-n to dry-run, więc na serwerze nic nie jest zapisywane. Mimo to ssh-copy-id najpierw próbuje zalogować się tym kluczem, żeby odsiać już zarejestrowane klucze, a ponieważ 192.0.2.10 to adres do dokumentacji, połączenie się nie udało i skończyło się na timed out. Opcje po -o trafiają bez zmian do ssh.

ssh-copy-id -n -f -i ~/.ssh/deploy_key.pub -o ConnectTimeout=3 user@192.0.2.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/deploy_key.pub"
=-=-=-=-=-=-=-=
Would have added the following key(s):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.com
=-=-=-=-=-=-=-=

-f to tryb wymuszony, który pomija to sprawdzenie. Razem z -n pod Would have added pojawiła się linia klucza publicznego, która trafiłaby na serwer. To ta sama linia co zawartość pliku .pub.

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.0.2.10

Właściwa rejestracja odbywa się tym poleceniem bez -n. Według skryptu ssh-copy-id i podręcznika polecenie raz pyta o hasło do konta, dopisuje klucz publiczny na końcu ~/.ssh/authorized_keys na serwerze, a potem wypisuje Number of key(s) added: 1. Jeśli pliku i katalogu nie ma, tworzy je, a jeśli ten sam klucz już jest, pomija go.

ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@192.0.2.10

Jeśli port to nie 22, podaj go przez -p.

Tam, gdzie nie ma ssh-copy-id, dopisz linię klucza publicznego do authorized_keys na serwerze samodzielnie. Zaloguj się na serwer hasłem i wykonaj kroki poniżej. Wynik sprawdzono, dopisując plik .pub na tym samym serwerze; na innym serwerze skopiuj linię z pliku .pub i dopisz ją przez echo.

mkdir -p ~/.ssh
chmod 700 ~/.ssh

Jeśli katalogu .ssh nie ma, utwórz go i ustaw uprawnienia na 700.

cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.com
ls -l ~/.ssh/authorized_keys
-rw------- 1 user user 100 Oct 29 08:22 /home/user/.ssh/authorized_keys

Linia klucza publicznego trafiła do authorized_keys z uprawnieniami 600. Punkt StrictModes w podręczniku sshd_config podaje, że przy ustawieniach domyślnych sshd najpierw sprawdza uprawnienia plików użytkownika i odrzuca logowanie, jeśli każdy może w nich pisać.

ssh -i ~/.ssh/id_ed25519 user@192.0.2.10

Po rejestracji łączysz się kluczem prywatnym. Jeśli klucz ma domyślną nazwę, na przykład id_ed25519, ssh znajdzie go sam; jeśli ma inną nazwę, na przykład deploy_key, wskaż plik opcją ssh -i.

🔲 Symulator polecenia ssh-keygen

W symulatorze poniżej możesz sam wpisać ssh-keygen, żeby utworzyć klucze, sprawdzić odciski, zmienić hasło klucza, uporządkować known_hosts i wypróbować ssh-copy-id. Odciski i klucze publiczne to te same przykładowe wartości co w artykule, a ssh-copy-id tylko udaje rejestrację na wirtualnym serwerze.

Symulator polecenia ssh-keygenOpenSSH 9.9p1 · user
[root@server work]#
Klawiszami ↑↓ przywołasz wcześniej wpisane polecenia.

🔢 FAQ & polecane treści

Domyślnym typem w ssh-keygen jest ed25519, a klucz jest krótki: linia klucza publicznego miała 98 bajtów. Klucz publiczny rsa o długości 4096 bitów miał 742 bajty; rsa przydaje się przy łączeniu ze starymi serwerami lub urządzeniami, które nie przyjmują ed25519.

Tak. Według podręcznika ssh, ssh sam szuka tylko domyślnych nazw, takich jak ~/.ssh/id_ed25519 i ~/.ssh/id_rsa, więc inną nazwę podajesz przy łączeniu przez -i albo wpisujesz w IdentityFile w ~/.ssh/config.

Według podręcznika sshd_config ustaw PasswordAuthentication na no i każ sshd ponownie wczytać konfigurację. Wyłącz je dopiero po sprawdzeniu w innym terminalu, że logowanie kluczem działa. Jeśli wyłączysz je przed sprawdzeniem, możesz nie wejść ani hasłem, ani kluczem i zostać odcięty od serwera.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 6   +   4   =