SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor

Tạo SSH key ed25519 bằng ssh-keygen từng bước

Cách tạo SSH key ed25519 trên Ubuntu: lệnh cần chạy, file nào là private key, cài public key lên VPS và GitHub, đặt passphrase và nạp key vào agent.

Tạo SSH key ed25519 bằng ssh-keygen

Để tạo SSH key ed25519, bạn chạy một lệnh ssh-keygen trên máy tính cá nhân và nhận về hai file trong thư mục ~/.ssh: một private key giữ lại trên máy, một public key đem dán lên VPS hoặc GitHub. Việc tạo key mất chưa đến một giây. Việc còn lại là hiểu hai file đó và đưa public key lên đúng chỗ với đúng quyền truy cập.

SSH (Secure Shell) là giao thức bạn dùng để mở terminal trên máy chủ từ xa. Đăng nhập bằng key thay cho mật khẩu là điều mọi hướng dẫn về SSH là gì và vì sao key an toàn hơn mật khẩu đều khuyên, và là việc nên làm ngay trong mười phút đầu tiên với một VPS mới, trước cả khi cài phần mềm.

Mở terminal trên máy tính của bạn, không phải trên VPS, và chạy ssh-keygen -t ed25519 -C "ten-ban@laptop".

-t ed25519 chọn thuật toán. -C là phần chú thích (comment): một đoạn chữ gắn vào cuối public key để bạn nhận ra key này thuộc máy nào, thường là địa chỉ email hoặc tên máy. Chú thích không tham gia vào mã hóa, nên đổi nó không làm key yếu đi hay mạnh lên. Nên viết chú thích không dấu để tránh rắc rối khi dán vào các giao diện web.

Lệnh hỏi bạn ba câu. Câu thứ nhất là Enter file in which to save the key (/home/ban/.ssh/id_ed25519):. Nhấn Enter để giữ đường dẫn mặc định, vì ssh tự tìm file ở đúng chỗ này khi bạn đăng nhập. Câu thứ hai là Enter passphrase (empty for no passphrase):. Passphrase (cụm mật khẩu) là mật khẩu bảo vệ file private key trên đĩa. Nhập một cụm dài, hoặc nhấn Enter để bỏ trống. Câu thứ ba yêu cầu nhập lại passphrase để xác nhận.

Nếu terminal báo ssh-keygen: command not found, gói openssh-client chưa có trên máy. Trên Ubuntu và Debian, cài nó rồi chạy lại:

sudo apt-get update && sudo apt-get install -y openssh-client

Khi viết script, hoặc khi bạn muốn trả lời cả ba câu hỏi ngay trong lệnh, dùng -f để chỉ đường dẫn và -N để đặt passphrase:

mkdir -p ~/.ssh && chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "ten-ban@laptop" -f ~/.ssh/id_ed25519 -N ''

-N '' nghĩa là passphrase rỗng. Dạng này chạy xong không hỏi gì, nên hợp để thử trên một VPS test. Với key bạn dùng hằng ngày, hãy đặt passphrase; phần cuối bài giải thích cách làm mà không phải gõ lại mỗi lần đăng nhập.

Một điểm cần chú ý trước khi chạy: nếu ~/.ssh/id_ed25519 đã tồn tại, ssh-keygen hỏi Overwrite (y/n)?. Trả lời y sẽ xóa key cũ, và mọi máy chủ đang nhận key cũ từ chối bạn ngay lập tức. Chạy ls ~/.ssh trước khi tạo key mới. Nếu đã có key, hãy dùng nó, hoặc đặt tên khác bằng -f ~/.ssh/id_ed25519_vps.

Khi chạy thành công, màn hình in dòng Your identification has been saved in /home/ban/.ssh/id_ed25519, dòng Your public key has been saved in /home/ban/.ssh/id_ed25519.pub, một dòng The key fingerprint is: kèm chuỗi bắt đầu bằng SHA256:, và một ô hình vẽ bằng ký tự gọi là randomart. Bạn không cần quan tâm đến randomart.

Hai file vừa tạo: file nào là private key, file nào là public key

ls -l ~/.ssh

Bạn sẽ thấy hai file. id_ed25519, không có phần mở rộng, là private key (khóa riêng). id_ed25519.pub là public key (khóa công khai). Cột đầu tiên của ls -l là quyền truy cập. Private key phải hiện -rw-------, tức chỉ chủ file đọc và ghi được; ssh-keygen tự đặt quyền này khi tạo file. Public key hiện -rw-r--r--, ai cũng đọc được, và điều đó là bình thường. Thư mục ~/.ssh phải là drwx------.

Quyền của private key không phải chuyện hình thức. Nếu file này đọc được bởi người dùng khác, ssh từ chối dùng nó, in ra WARNING: UNPROTECTED PRIVATE KEY FILE! cùng dòng Permissions 0644 for '/home/ban/.ssh/id_ed25519' are too open., rồi quay sang hỏi mật khẩu. Lỗi này hay gặp khi bạn chép key từ máy khác qua USB hoặc từ Windows, vì phân vùng FAT và NTFS không giữ quyền của Linux. Sửa bằng chmod 600 ~/.ssh/id_ed25519.

Xem nội dung public key:

cat ~/.ssh/id_ed25519.pub

Đây là một dòng duy nhất gồm ba phần cách nhau bằng dấu cách. Từ đầu tiên là ssh-ed25519, tên thuật toán. Phần giữa là một chuỗi base64, chính là khóa. Phần cuối là chú thích bạn đặt bằng -C. Dòng này là thứ bạn sẽ dán lên VPS và vào GitHub hay GitLab. Public key được thiết kế để công khai, nên gửi nó qua chat hay email không có gì nguy hiểm, chi tiết nằm trong bài chia sẻ SSH public key có an toàn không.

Private key thì ngược lại. Nó bắt đầu bằng dòng -----BEGIN OPENSSH PRIVATE KEY-----. Không bao giờ dán nó vào đâu, không gửi cho ai, không commit vào git, không chép lên VPS. Máy chủ chỉ cần public key để xác thực bạn. Ai có private key là có quyền đăng nhập như bạn.

Fingerprint (vân tay khóa) là một chuỗi ngắn đại diện cho public key, dùng để so sánh key mà không cần đọc cả chuỗi base64:

ssh-keygen -lf ~/.ssh/id_ed25519.pub

Dòng in ra gồm độ dài khóa tính bằng bit, chuỗi SHA256:..., chú thích, và (ED25519) ở cuối. Ghi lại chuỗi SHA256: này. Sau khi bạn thêm key vào GitHub, trang cài đặt hiển thị đúng chuỗi đó; nếu hai chuỗi khác nhau thì bạn đã dán nhầm key.

Nếu lỡ xóa file .pub, không cần tạo key mới. Public key tính lại được từ private key:

ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub

Nên chọn loại SSH key nào

Chọn ed25519 trừ khi có lý do cụ thể để không chọn. Key ed25519 có độ dài cố định 256 bit, không có tham số nào để chọn sai, ký và xác thực nhanh, và public key ngắn đến mức dán vào đâu cũng gọn. OpenSSH hỗ trợ ed25519 từ phiên bản 6.5 năm 2014, nên mọi máy chủ Linux còn được cập nhật đều nhận nó. Ubuntu 24.04 đi kèm OpenSSH 9.6, và tính đến tháng 9 năm 2026 đây vẫn là bản mà phần lớn VPS Ubuntu đang chạy.

RSA chỉ còn cần cho thiết bị và dịch vụ cũ: một số switch, router, thiết bị NAS đời cũ, hay ứng dụng Java dùng thư viện SSH cũ từ chối ed25519. Khi gặp trường hợp đó, tạo key RSA dài 4096 bit:

ssh-keygen -t rsa -b 4096 -C "ten-ban@laptop" -f ~/.ssh/id_rsa_thietbicu -N ''

-b 4096 là độ dài khóa. Bỏ -b thì ssh-keygen mặc định 3072 bit, đủ dùng, nhưng 4096 là con số mọi tài liệu thống nhất. Đặt tên file khác id_rsa mặc định để key RSA này chỉ dùng cho thiết bị cũ, còn key ed25519 dùng cho mọi thứ khác.

DSA và RSA 1024 bit đã bị loại bỏ hẳn. DSA bị khóa cứng ở 1024 bit và dựa vào SHA-1, nên OpenSSH tắt nó theo mặc định từ phiên bản 7.0 năm 2015 và xóa hẳn mã hỗ trợ trong phiên bản 10.0 năm 2025. Một client mới thậm chí không gửi key DSA nữa, và bạn bị hỏi mật khẩu như thể chưa có key. RSA 1024 bit thì quá ngắn so với sức tính toán hiện nay: ssh-keygen từ chối tạo key ngắn hơn 1024 bit và sshd từ chối nhận chúng. Nếu bạn còn một file id_dsa hay id_rsa cũ từ nhiều năm trước, tạo key ed25519 mới và thay dần, đừng cố giữ.

Một điểm gây nhầm lẫn: chữ ssh-rsa ở đầu file .pub là tên định dạng key, không phải thuật toán ký. OpenSSH 8.8 năm 2021 tắt chữ ký ssh-rsa dùng SHA-1, nhưng key RSA vẫn đăng nhập bình thường qua chữ ký rsa-sha2-256rsa-sha2-512. Key RSA 4096 tạo hôm nay vẫn dùng được với máy chủ mới.

Cài public key lên VPS

Máy chủ SSH quyết định ai được đăng nhập bằng file ~/.ssh/authorized_keys trong thư mục home của từng người dùng. Mỗi dòng trong file là một public key. Cài key nghĩa là thêm dòng public key của bạn vào file đó, với đúng quyền truy cập.

Cách thủ công cho bạn thấy chính xác điều gì xảy ra. Đăng nhập vào VPS bằng mật khẩu, hoặc qua console trên trang quản lý của nhà cung cấp, rồi chạy:

mkdir -p ~/.ssh && chmod 700 ~/.ssh
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Dòng thứ hai giả định file id_ed25519.pub đã nằm trên VPS, ví dụ bạn chép nó lên bằng scp. Nếu chưa, thay dòng đó bằng echo với nội dung bạn vừa cat trên máy cá nhân, đặt trong dấu nháy kép: echo "ssh-ed25519 AAAA... ten-ban@laptop" >> ~/.ssh/authorized_keys. Dấu >> nối thêm vào cuối file, còn > ghi đè và xóa mọi key đã có, kể cả key của người khác đang dùng chung máy chủ.

Hai lệnh chmod không phải cho đẹp. sshd_config(5) có tùy chọn StrictModes, được mô tả là bảo sshd kiểm tra chủ sở hữu và quyền của thư mục home, của ~/.ssh và của authorized_keys trước khi chấp nhận đăng nhập, vì người mới hay lỡ để thư mục ghi được bởi mọi người. Image VPS của bạn có bật tùy chọn này hay không, xem bằng sudo sshd -T | grep -i strictmodes trên VPS, nhưng đừng lấy kết quả đó làm cớ nới quyền. chmod 700 cho thư mục và chmod 600 cho file là giá trị an toàn với mọi cấu hình, và cũng là thứ ngăn người dùng khác trên cùng máy chủ đọc hay sửa danh sách key của bạn.

Kiểm tra từ máy cá nhân bằng ssh ban@203.0.113.10, thay tên người dùng và địa chỉ bằng của bạn.

Lần đầu tiên, ssh hỏi Are you sure you want to continue connecting (yes/no/[fingerprint])? vì máy của bạn chưa biết fingerprint của máy chủ. Gõ yes. Nếu bạn đặt passphrase, ssh hỏi passphrase của key, không phải mật khẩu tài khoản trên VPS. Vào được shell mà không phải gõ mật khẩu tài khoản nghĩa là key đã hoạt động.

ssh-copy-id làm cả ba bước trên trong một lệnh, chạy từ máy cá nhân: ssh-copy-id -i ~/.ssh/id_ed25519.pub ban@203.0.113.10.

Lệnh này đăng nhập bằng mật khẩu một lần, tạo ~/.ssh nếu chưa có, nối public key vào authorized_keys và đặt quyền. Nó cần VPS còn cho phép đăng nhập bằng mật khẩu, nên hãy chạy nó trước khi tắt PasswordAuthentication. Chỉ khi key đã đăng nhập được, bạn mới nên tắt đăng nhập bằng mật khẩu và siết cấu hình sshd. Làm ngược thứ tự là tự khóa mình bên ngoài.

Thêm key vào GitHub hoặc GitLab

Với GitHub và GitLab, bạn không chạm vào authorized_keys, chỉ dán public key vào giao diện web. Trên GitHub: bấm ảnh đại diện góc phải, chọn Settings, vào mục SSH and GPG keys, bấm New SSH key, dán toàn bộ dòng từ cat ~/.ssh/id_ed25519.pub vào ô Key. Trên GitLab: ảnh đại diện, Preferences, mục SSH Keys. Cả hai đều nhận key ed25519 và đều hiển thị fingerprint sau khi lưu; so nó với kết quả ssh-keygen -lf ở trên.

Kiểm tra bằng ssh -T git@github.com. GitHub trả lời Hi ten-ban! You've successfully authenticated, but GitHub does not provide shell access. Câu đó là thành công, không phải lỗi: GitHub chỉ không cho mở shell. GitLab trả lời Welcome to GitLab, @ten-ban! khi bạn chạy ssh -T git@gitlab.com. Sau đó git clone với địa chỉ dạng git@github.com:user/repo.git dùng key này mà không hỏi gì.

Passphrase và ssh-agent

Passphrase mã hóa file private key trên đĩa. Không có passphrase, ai chép được file id_ed25519 là đăng nhập được vào mọi máy chủ có public key của bạn, và bạn không hề biết. Có passphrase, kẻ đó cần thêm cụm mật khẩu, và bạn có thời gian để thay key. Nếu đã tạo key với -N '', thêm passphrase sau bằng ssh-keygen -p -f ~/.ssh/id_ed25519. Lệnh này chỉ đổi lớp mã hóa của file; key bên trong và public key giữ nguyên, nên không phải cài lại lên đâu cả.

ssh-agent là chương trình giữ private key đã giải mã trong bộ nhớ, để bạn gõ passphrase một lần cho cả phiên làm việc thay vì mỗi lần ssh hay git push. Khởi động nó và nạp key:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l

ssh-add hỏi passphrase, rồi ssh-add -l liệt kê fingerprint của key đang nạp, cùng chuỗi SHA256: bạn thấy ở trên. Nếu ssh-add báo Could not open a connection to your authentication agent., chưa có agent nào chạy, và dòng eval phía trên là thứ bị bỏ sót. Trên Ubuntu bản desktop, GNOME Keyring đã chạy sẵn một agent nên ssh-add thường chạy được ngay. Agent chỉ sống trong phiên hiện tại; sau khi khởi động lại máy, bạn chạy lại hai lệnh đầu.

Nếu bạn dùng Windows

Windows 10 và Windows 11 có sẵn OpenSSH client, nên không cần PuTTY hay phần mềm nào khác chỉ để tạo key. Mở PowerShell và chạy đúng lệnh ssh-keygen -t ed25519 -C "ten-ban@laptop" như trên. Key nằm trong thư mục C:\Users\<TenBan>\.ssh\, với hai file id_ed25519id_ed25519.pub giống hệt trên Linux. Xem public key bằng Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub rồi dán như bình thường. Nếu PowerShell báo không nhận ra ssh-keygen, vào Settings, Apps, Optional features và bật OpenSSH Client. Windows không có ssh-copy-id, nên dùng cách dán thủ công ở phần trên. Nếu bạn vẫn quen PuTTY, PuTTYgen nhập được file id_ed25519 qua menu Conversions, Import key, rồi lưu ra định dạng .ppk riêng của nó.

Khi lần đăng nhập đầu tiên bị từ chối

Thêm -v để ssh kể lại nó đã làm gì: ssh -v ban@203.0.113.10. Dòng Offering public key: /home/ban/.ssh/id_ed25519 ED25519 SHA256:... nghĩa là client đã gửi key. Nếu ngay sau đó là Permission denied (publickey), máy chủ đã nhận key và từ chối, nên lỗi nằm ở phía VPS: sai tên người dùng, public key nằm trong authorized_keys của người dùng khác, hoặc dòng key bị dán thiếu ký tự. Nếu không có dòng Offering nào, client không tìm thấy key, thường vì bạn đặt tên file khác mặc định mà không dùng -i. Bài sửa lỗi SSH Permission denied publickey đi qua từng nguyên nhân với dòng log tương ứng trên cả hai phía.

FAQ

Nên tạo SSH key trên máy tính cá nhân hay trên VPS?

Trên máy tính cá nhân. Private key sinh ra ở đâu thì ở yên đó, và chỉ public key đi lên VPS. Tạo key trên VPS rồi tải private key về máy là làm ngược, vì file private key đã đi qua mạng và đã tồn tại trên một máy chủ mà bạn không kiểm soát hoàn toàn. Mỗi máy tính bạn dùng nên có một key riêng; khi mất một máy, bạn chỉ xóa đúng dòng của máy đó khỏi authorized_keys.

Một SSH key dùng cho nhiều máy chủ có được không?

Được, và đó là cách dùng bình thường. Public key là công khai, dán cùng một dòng lên mười VPS và GitHub không làm giảm độ an toàn. Điều cần tránh là dùng chung một private key trên nhiều máy tính, vì khi đó bạn không biết key bị lộ từ máy nào và phải thay ở mọi nơi.

Tôi quên passphrase của private key thì sao?

Không có cách khôi phục. Passphrase là chìa khóa giải mã file, và OpenSSH không giữ bản sao nào. Tạo key mới bằng ssh-keygen -t ed25519, cài public key mới lên từng máy chủ và dịch vụ, rồi xóa dòng public key cũ khỏi authorized_keys. Nếu VPS đã tắt đăng nhập bằng mật khẩu, bạn cần console trên trang quản lý của nhà cung cấp để làm việc này.

ed25519 và RSA 4096, cái nào an toàn hơn?

Cả hai đều đủ an toàn cho mọi mục đích thực tế tính đến tháng 9 năm 2026. ed25519 được chọn mặc định vì nhỏ hơn, nhanh hơn, không có tham số nào để chọn sai, và được mọi OpenSSH từ năm 2014 hỗ trợ. RSA 4096 chỉ cần khi thiết bị hoặc dịch vụ bạn kết nối từ chối ed25519. DSA đã bị xóa khỏi OpenSSH, còn RSA dưới 1024 bit bị sshd từ chối.

ssh-keygen báo file đã tồn tại, tôi có nên ghi đè không?

Không, trừ khi bạn chắc chắn key cũ không còn dùng ở đâu. Ghi đè xóa private key cũ vĩnh viễn, và mọi máy chủ hay tài khoản GitHub đang nhận key đó sẽ từ chối bạn. Trả lời n, rồi tạo key mới với tên khác bằng -f ~/.ssh/id_ed25519_moi. Nếu muốn biết key cũ đang dùng ở đâu, chạy ssh-keygen -lf ~/.ssh/id_ed25519.pub để lấy fingerprint rồi so với danh sách key trên GitHub và trong authorized_keys của từng máy chủ.

#SSH#ssh-keygen#ed25519#linux#bảo mật#vps