ssh-keygen: tạo khóa SSH, đăng ký khóa công khai và cách dùng ssh-copy-id

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8Tài khoản rootKiểm tra ngày 2026-11-05
Lệnh mạngssh-keygenssh-copy-idVị trí/usr/bin/ssh-keygen

ssh-keygen là lệnh OpenSSH tạo cặp khóa riêng tư và khóa công khai dùng cho kết nối SSH, đồng thời đảm nhận việc kiểm tra dấu vân tay, đổi passphrase và dọn dẹp known_hosts. Khi tạo khóa ed25519 và rsa trên máy chủ AlmaLinux 9, kiểm tra dấu vân tay, đổi passphrase và chú thích rồi thử ssh-copy-id ở chế độ dry-run, thứ duy nhất được gửi lên máy chủ chỉ là một dòng khóa công khai trong tệp .pub.

Tên tài khoản và đường dẫn tệp khóa trong kết quả bên dưới là giá trị ví dụ, còn dấu vân tay, khóa công khai và randomart là của các khóa được tạo trong lúc viết bài rồi xóa đi. Lệnh thực sự đăng ký khóa công khai lên máy chủ chỉ được ghi ra, không được chạy.

1️⃣ Tạo khóa bằng ssh-keygen: -t ed25519 và chú thích -C

Khóa được tạo theo dạng ssh-keygen -t loại -C chú_thích. -t là loại khóa, còn -C là chú thích gắn ở cuối khóa công khai, thường ghi email hoặc mục đích dùng khóa. Bên dưới là toàn bộ kết quả khi chỉ định tệp bằng -f và nhấn Enter luôn ở cả hai câu hỏi passphrase.

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]-----+

Nếu chỉ nhấn Enter ở câu hỏi passphrase, khóa sẽ không có passphrase. Nếu bỏ -f, trước câu hỏi passphrase sẽ hiện trước một dòng hỏi nơi lưu tệp. Trong ngoặc là đường dẫn mặc định .ssh/id_ed25519 trong thư mục home, và chỉ cần nhấn Enter là khóa được lưu vào đó.

randomart ở cuối kết quả là dấu vân tay được chuyển thành hình vẽ. Lúc tạo khóa và lúc kiểm tra lại bằng -lv đều hiện cùng một hình.

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

Khóa riêng tư được tạo với quyền 600, khóa công khai với quyền 644. Khóa riêng tư chỉ để trên máy tính của bạn và không gửi đi đâu cả.

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

Khóa công khai là một dòng gồm loại khóa, giá trị khóa và chú thích, cách nhau bằng dấu cách. Chính dòng này được đưa vào authorized_keys của máy chủ bạn kết nối tới. Vai trò của từng tệp trong thư mục được gom lại thành cây.

~/.sshThư mục chứa khóa và dữ liệu kết nối · quyền 700
id_ed25519Khóa riêng tư · tệp chỉ nằm trên máy tính của bạn · quyền 600
id_ed25519.pubMột dòng khóa công khai · đưa vào authorized_keys của máy chủ đích · quyền 644
authorized_keysDanh sách khóa công khai được phép đăng nhập vào máy chủ này (nằm trên máy chủ nhận)
known_hostsKhóa máy chủ của các máy chủ bạn từng kết nối · ssh-keygen -R xóa từng dòng
configBí danh, cổng và tệp khóa theo từng máy chủ (ssh_config)

2️⃣ Tùy chọn của ssh-keygen: -f, -N, -b, -q

Cách vừa trả lời câu hỏi vừa tạo khóa tiện khi gõ tay, nhưng trong script thì phải bỏ hẳn các câu hỏi. Chỉ định tệp bằng -f và đưa passphrase bằng -N thì khóa được tạo ngay mà không hỏi gì.

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]-----+

Đưa cặp dấu nháy rỗng sau -N thì khóa không có passphrase, và vị trí lưu cùng dấu vân tay hiện ra một lượt mà không có câu hỏi nào.

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)?

Chạy lại với cùng tên thì sau already exists sẽ hỏi có ghi đè hay không. Nhấn n thì không có gì thay đổi và lệnh kết thúc với mã thoát 1. Để không lỡ tay ghi đè khóa đang dùng, hãy tạo khóa mới bằng tên khác.

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]-----+

Với rsa, -b quy định độ dài. Theo tài liệu hướng dẫn, mặc định là 3072 bit; ở trên khóa được tạo với 4096 bit nên đầu randomart hiện RSA 4096. Tài liệu hướng dẫn ghi rằng ed25519 có độ dài cố định nên -b sẽ bị bỏ qua.

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]-----+

Khi bỏ -t, khóa ed25519 được tạo.

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

Thêm -q thì mọi thứ đều bị ẩn, kể cả dấu vân tay và randomart, chỉ còn lại mã thoát. Dùng khi script tạo khóa cho nhiều máy chủ.

📌 Tùy chọn chính: kết quả chạy trong bài này

Tùy chọnChức năngKết quả trong bài này
-t loạiLoại khóa sẽ tạoDòng đầu của kết quả hiện loại như ed25519, rsa; bỏ qua thì là ed25519
-C chú_thíchChú thích gắn ở cuối khóa công khaiuser@example.com ở cuối khóa công khai xem bằng cat
-f tệpĐường dẫn tệp khóaDòng báo đã lưu vào /home/user/.ssh/deploy_key; chạy lại với cùng tên thì có already exists và Overwrite (y/n)?
-N passphrasePassphrase mới; dấu nháy rỗng nghĩa là không có passphraseVị trí lưu và dấu vân tay một lượt, không hỏi passphrase
-b bitĐộ dài khóaĐưa 4096 cho rsa thì đầu randomart hiện RSA 4096
-qẨn toàn bộ kết quảChỉ còn dòng rc=0 in bằng echo
-lIn dấu vân tay của tệp khóaCùng một dấu vân tay SHA256 từ khóa công khai và khóa riêng tư; với authorized_keys, mỗi khóa một dòng
-E hashChỉ định loại hash của dấu vân tayVới -E md5, dấu vân tay bắt đầu bằng MD5:00:7b:02:5e
-vDùng cùng -l thì in cả randomartrandomart giống lúc tạo khóa
-yLấy khóa công khai từ khóa riêng tư rồi in raMột dòng khóa công khai giống hệt từng ký tự với tệp .pub
-pĐổi passphrase của khóa riêng tưHiện dòng báo đã lưu với passphrase mới, và khóa riêng tư tăng từ 411 lên 464 byte
-P passphrasePassphrase cũ (đang đặt hiện tại)Đúng passphrase thì ra khóa công khai, sai thì ra incorrect passphrase supplied to decrypt private key
-cĐổi chú thích; chú thích mới đưa bằng -COld comment: user@example.com và Comment 'user@laptop' applied
-F máy_chủTìm dòng của máy chủ đó trong known_hosts# Host 192.0.2.10 found: line 1 và chính dòng đó
-R máy_chủXóa dòng của máy chủ đó khỏi known_hostsknown_hosts updated và tệp gốc known_hosts.old; máy chủ không có thì ra not found
-HBăm tên máy chủ và địa chỉ trong known_hostsCác dòng chuyển thành bắt đầu bằng |1|, kèm WARNING rằng tệp .old còn giữ các dòng trước khi băm

📎 Tùy chọn khác: theo tài liệu hướng dẫn chính thức

Tùy chọnChức năng
-a số_vòngSố vòng KDF (bcrypt_pbkdf) khi lưu khóa riêng tư; càng lớn thì kiểm tra passphrase càng chậm và càng chống được dò mật khẩu kiểu brute force; mặc định 16
-ATạo các khóa máy chủ còn thiếu cho từng loại mặc định (rsa, ecdsa, ed25519) ở đường dẫn mặc định
-BIn bản tóm tắt bubblebabble của tệp khóa
-eChuyển khóa OpenSSH sang định dạng -m (mặc định RFC4716) rồi in ra, dùng cho chương trình SSH khác
-iChuyển khóa không có passphrase ở định dạng -m (mặc định RFC4716) sang định dạng OpenSSH rồi in ra
-m định_dạngChỉ định định dạng khóa (RFC4716, PKCS8, PEM); dùng cùng -p để chuyển khóa riêng tư qua lại giữa định dạng OpenSSH và PEM
-r máy_chủIn bản ghi DNS SSHFP của tên máy chủ đó từ khóa công khai
-s khóa_CAKý khóa công khai bằng khóa CA để tạo chứng chỉ
-LIn nội dung chứng chỉ
-KTải các khóa resident lưu trên thiết bị xác thực FIDO về thư mục hiện tại
-Y signKý tệp bằng khóa SSH; chữ ký được lưu với đuôi .sig thêm vào tên tệp, còn tên mục đích đưa bằng -n

3️⃣ ssh-keygen -l kiểm tra dấu vân tay và -y lấy ra khóa công khai

Khi có nhiều tệp khóa, chỉ nhìn tên tệp thì khó biết khóa công khai nào là cặp của khóa riêng tư nào. Vì dấu vân tay của khóa riêng tư và khóa công khai có cùng giá trị, so dấu vân tay của hai tệp bằng -l là xác nhận được cặp.

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)

Tệp khóa công khai và tệp khóa riêng tư cho cùng một dấu vân tay SHA256. Số 256 ở đầu là độ dài khóa, còn phần trong ngoặc ở cuối là loại khóa.

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)

Thêm -E md5 thì chuyển sang dấu vân tay MD5 kiểu cũ. Dùng để đối chiếu khi máy chủ cũ hoặc trang quản trị hiển thị dấu vân tay 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]-----+

Thêm -v thì randomart hiện lại. Đó là đúng hình đã in ra lúc tạo khóa.

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

Nếu đưa tệp có nhiều dòng khóa công khai như authorized_keys, mỗi khóa sẽ ra một dòng dấu vân tay. Đây là cách kiểm tra máy chủ đang đăng ký những khóa nào.

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

-y lấy lại khóa công khai từ khóa riêng tư. Nếu đã xóa tệp .pub hoặc chỉ chuyển khóa riêng tư sang máy tính khác, chỉ cần lưu kết quả này vào tệp. Kết quả giống hệt từng ký tự với tệp .pub gốc.

4️⃣ ssh-keygen -p đổi passphrase và -c đổi chú thích

Đặt passphrase cho khóa riêng tư thì dù tệp bị lộ cũng không dùng được nếu không có passphrase. Đổi lại, mỗi lần kết nối phải gõ passphrase, nên hợp với khóa do người dùng kết nối bằng tay, không hợp với khóa của script tự chạy như 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 là passphrase cũ, -N là passphrase mới. Khóa chưa có passphrase nên -P được đưa dấu nháy rỗng, và hiện hai dòng báo đã lưu lại với passphrase mới. Tài liệu hướng dẫn ghi rằng nếu chỉ dùng -p mà không có tùy chọn, lệnh sẽ lần lượt hỏi passphrase cũ và mới.

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

Sau khi đặt passphrase, tệp khóa riêng tư tăng từ 411 lên 464 byte.

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

Với khóa có passphrase, -y cũng cần đưa passphrase bằng -P. Đúng passphrase thì ra khóa công khai giống như trước, sai thì kết thúc với lỗi incorrect passphrase. Tài liệu hướng dẫn nói rõ không có cách khôi phục passphrase đã mất, nên nếu quên thì hãy tạo khóa mới và đăng ký lại khóa công khai.

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 đổi chú thích. Chú thích cũ và mới mỗi cái hiện một dòng, và chú thích ở cuối tệp khóa công khai cũng đổi thành user@laptop. Chú thích chỉ là nhãn để phân biệt khóa nên bản thân giá trị khóa vẫn giữ nguyên.

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.

Muốn bỏ passphrase thì đưa dấu nháy rỗng cho -N. Vẫn hiện hai dòng như trên, và từ đó -y lại chạy được mà không cần -P.

5️⃣ ssh-keygen -R xóa khóa máy chủ trong known_hosts

known_hosts tích lũy khóa máy chủ của các máy chủ bạn từng kết nối, mỗi máy một dòng. Nếu cài lại máy chủ và khóa máy chủ thay đổi, ssh sẽ từ chối kết nối vì khóa khác với khóa đã lưu, và tùy chọn xóa dòng cũ chính là -R. known_hosts bên dưới là tệp ba dòng tạo bằng địa chỉ ví dụ, được chỉ định bằng -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

Mỗi dòng gồm tên máy chủ hoặc địa chỉ, loại khóa và giá trị khóa theo thứ tự. Dòng thứ hai nối bằng dấu phẩy là tên và địa chỉ của cùng một máy chủ, còn dấu ngoặc vuông và dấu hai chấm ở dòng thứ ba là cổng khác 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 in dòng của máy chủ đó kèm số thứ tự dòng. Với máy chủ không có, lệnh không in gì và kết thúc với mã thoát 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 xóa dòng của máy chủ đó và giữ tệp gốc thành known_hosts.old. Sau khi xóa chỉ còn lại hai dòng.

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

Chỉ định máy chủ không có thì chỉ hiện một dòng not found. Máy chủ dùng cổng khác phải ghi cả dấu ngoặc vuông và cổng đúng như trong known_hosts thì mới tìm thấy.

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 băm tên máy chủ và địa chỉ. Đây là tùy chọn giúp dù tệp bị lộ cũng không biết bạn từng kết nối máy chủ nào, và tên với địa chỉ vốn nối bằng dấu phẩy được tách thành hai dòng băm. Cũng hiện cảnh báo rằng tệp .old vẫn còn nội dung trước khi băm.

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

Ngay cả trong tệp đã băm, -F vẫn tìm thấy dòng đó theo tên.

6️⃣ ssh-copy-id đăng ký khóa công khai và authorized_keys

Tạo khóa rồi nhưng nếu máy chủ chưa biết khóa công khai đó thì vẫn phải đăng nhập bằng mật khẩu. Nơi cho máy chủ biết khóa công khai là ~/.ssh/authorized_keys của tài khoản bạn đăng nhập, và lệnh đưa một dòng .pub vào tệp này là ssh-copy-id. Khóa riêng tư ở lại máy tính của bạn, chỉ một dòng khóa công khai được gửi sang. Nhấn các nút bước trong sơ đồ bên dưới để xem hai tệp nằm ở đâu.

🔐 Luồng sử dụng cặp khóa ssh-keygen để kết nối
Sơ đồ giải thích
🔍 Các bước
$ 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áy tính của tôi ~/.ssh
🔒id_ed25519Khóa riêng tư · không gửi ra ngoài
🔑id_ed25519.pubMột dòng khóa công khai · sao chép lên máy chủ
➜Chưa có trên máy chủĐã sao chép một dòng khóa công khaiMáy chủ kiểm tra bằng khóa công khai
🖥️ Máy chủ ~/.ssh/authorized_keys
📄TrốngChỉ đăng nhập bằng mật khẩu
🔑ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.comKhóa công khai đã đăng ký · chỉ khóa riêng tư cùng cặp với dòng này mới vào được
ssh-keygen tạo khóa riêng tư và khóa công khai thành một cặp. Khóa riêng tư chỉ để trong ~/.ssh trên máy tính của bạn, còn khóa công khai là một dòng trong tệp .pub. Ở bước này máy chủ chưa có gì nên chỉ đăng nhập được bằng mật khẩu.
ssh-copy-id thêm một dòng khóa công khai vào cuối ~/.ssh/authorized_keys trên máy chủ. Khóa riêng tư không bị sao chép. Khóa công khai không cần giữ bí mật nên có thể đưa cùng một dòng vào nhiều máy chủ.
Khi kết nối, máy chủ dùng khóa công khai trong authorized_keys để kiểm tra chữ ký từ khóa riêng tư của bạn. Nếu cặp khớp thì đăng nhập không cần mật khẩu; còn trên máy tính không có tệp khóa riêng tư, dù cùng tài khoản vẫn bị hỏi mật khẩu.
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 là dry-run nên không ghi gì lên máy chủ. Dù vậy, ssh-copy-id trước tiên vẫn thử đăng nhập bằng khóa đó để lọc ra các khóa đã đăng ký, và vì 192.0.2.10 là địa chỉ dùng cho tài liệu nên không kết nối được và kết thúc bằng timed out. Các tùy chọn sau -o được chuyển nguyên cho 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 là chế độ ép buộc bỏ qua bước kiểm tra này. Dùng cùng -n thì một dòng khóa công khai sẽ được đưa lên máy chủ hiện ra dưới Would have added. Đó là cùng dòng với nội dung tệp .pub.

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

Việc đăng ký thật được làm bằng lệnh này sau khi bỏ -n. Theo script và tài liệu hướng dẫn của ssh-copy-id, lệnh này hỏi mật khẩu của tài khoản đó một lần, thêm khóa công khai vào cuối ~/.ssh/authorized_keys trên máy chủ rồi in Number of key(s) added: 1. Nếu chưa có tệp và thư mục thì tạo mới, nếu đã có cùng khóa thì bỏ qua.

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

Nếu cổng không phải 22 thì truyền bằng -p.

Ở môi trường không có ssh-copy-id, hãy tự thêm một dòng khóa công khai vào authorized_keys trên máy chủ. Đăng nhập máy chủ bằng mật khẩu rồi làm theo thứ tự bên dưới. Kết quả được kiểm tra bằng cách thêm tệp .pub ngay trong cùng máy chủ; nếu là máy chủ khác thì sao chép dòng trong tệp .pub rồi thêm bằng echo.

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

Nếu chưa có thư mục .ssh thì tạo ra và đặt quyền 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

Một dòng khóa công khai đã vào authorized_keys với quyền 600. Mục StrictModes trong tài liệu hướng dẫn sshd_config ghi rằng ở cấu hình mặc định, sshd kiểm tra quyền tệp của người dùng trước và không chấp nhận đăng nhập nếu ai cũng ghi được.

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

Đăng ký xong thì kết nối bằng khóa riêng tư. Nếu khóa có tên mặc định như id_ed25519 thì ssh tự tìm thấy, còn nếu là tên khác như deploy_key thì chỉ định tệp bằng tùy chọn ssh -i.

🔲 Trình mô phỏng lệnh ssh-keygen

Trong trình mô phỏng bên dưới, bạn có thể tự gõ ssh-keygen để tạo khóa, kiểm tra dấu vân tay, đổi passphrase, dọn dẹp known_hosts và thử ssh-copy-id. Dấu vân tay và khóa công khai là cùng giá trị ví dụ như trong bài, còn ssh-copy-id chỉ mô phỏng việc đăng ký lên server ảo.

Trình mô phỏng lệnh ssh-keygenOpenSSH 9.9p1 · user
[root@server work]#
Dùng phím ↑↓ trên bàn phím để gọi lại các lệnh đã gõ trước đó.

🔢 FAQ & nội dung đề xuất

Mặc định của ssh-keygen là ed25519 và khóa ngắn: một dòng khóa công khai chỉ 98 byte. Khóa công khai rsa 4096 bit là 742 byte; rsa dùng khi kết nối tới máy chủ hoặc thiết bị cũ không nhận ed25519.

Được. Theo tài liệu hướng dẫn của ssh, ssh chỉ tự tìm các tên mặc định như ~/.ssh/id_ed25519, ~/.ssh/id_rsa, nên tên khác thì chỉ định bằng -i khi kết nối hoặc ghi vào IdentityFile trong ~/.ssh/config.

Theo tài liệu hướng dẫn sshd_config, đổi PasswordAuthentication thành no rồi cho sshd đọc lại cấu hình. Chỉ tắt sau khi đã kiểm tra trước ở một terminal khác rằng đăng nhập bằng khóa được. Nếu tắt trước khi kiểm tra, bạn có thể không vào được cả bằng mật khẩu lẫn bằng khóa và bị khóa ngoài máy chủ.

ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 7   +   1   =