Sử dụng SSH Key giúp bảo mật máy chủ tuyệt đối và loại bỏ rủi ro lộ mật khẩu khi quản trị từ xa. Bài viết dưới đây của Tenten sẽ hướng dẫn chi tiết từng bước tạo ssh key và xác thực kết nối SSH nhanh chóng, hiệu quả nhất cho người mới bắt […]
Sử dụng SSH Key giúp bảo mật máy chủ tuyệt đối và loại bỏ rủi ro lộ mật khẩu khi quản trị từ xa. Bài viết dưới đây của Tenten sẽ hướng dẫn chi tiết từng bước tạo ssh key và xác thực kết nối SSH nhanh chóng, hiệu quả nhất cho người mới bắt đầu.
Contents
Ssh-keygen là một công cụ dòng lệnh dùng để tạo ra một cặp khóa mã hóa gồm Khóa công khai (Public Key) và Khóa riêng tư (Private Key) nhằm xác thực kết nối bảo mật qua giao thức SSH. Cặp khóa này giúp bạn xác thực danh tính và đăng nhập an toàn vào máy chủ hoặc các dịch vụ như GitHub mà không cần dùng mật khẩu.
Trong đó:

Cơ chế xác thực bằng ssh-keygen hoạt động bằng cách dùng một cặp mã khóa: Khóa công khai (Public Key) được đặt trên máy chủ, và Khóa bí mật (Private Key) giữ an toàn ở máy của bạn. Khi kết nối, máy chủ tạo một thử thách mã hóa bằng Public Key mà chỉ Private Key mới giải được, giúp đăng nhập an toàn không cần mật khẩu.
Quy trình xác thực diễn ra như sau:

Trước khi tạo SSH Key, bạn cần thực hiện một số bước chuẩn bị để tránh ảnh hưởng đến các khóa đang được sử dụng:
Ed25519 và RSA là 2 cách phổ biến để tạo SSH Key. Tuy nhiên, 2 cách này có sự khác nhau nhất định giữa thuật toán và cùng tìm hiểu ưu và nhược điểm của từng cách nhé:
|
Tiêu chí |
RSA |
Ed25519 |
|
Nền tảng bảo mật |
Phân tích thừa số số nguyên (Integer factorization) |
Mật mã đường cong elliptic (ECC) |
|
Kích thước Key |
2048-4096 bit |
256 bit |
|
Kích thước Sign |
~256 bytes |
64 bytes |
|
Tốc độ ký (Signing) |
Chậm hơn |
Nhanh hơn, nhưng không thể thấy rõ |
|
Tốc độ xác minh |
Nhanh |
Rất nhanh |
|
Hiệu năng |
Tốn CPU, đặc biệt khi dùng key lớn |
Hiệu năng cao do nhẹ |
|
Tốc độ tạo key |
Chậm hơn |
Nhanh |
|
Độ đơn giản trong mã |
Phức tạp hơn |
Đơn giản |
|
Hỗ trợ, tương thích |
Rất phổ biến |
Hỗ trợ trên các hệ thống hiện đại (OpenSSH ≥ 6.5) |
|
Trường hợp sử dụng phù hợp |
TLS/SSL, mã hóa email (PGP), SSH |
SSH keys, ký mã (code signing), giao thức crypto hiện đại |
|
Tương thích ngược |
Rất tốt (kê cả hệ thống cũ) |
Cần hệ thống hiện đại |
|
Chữ ký xác định |
Không |
Có |
|
Thư viện hỗ trợ |
Có trong OpenSSL, BouncyCastle,… |
Tích hợp trong các thư viện hiện đại như libsodium |
Xét về mức độ bảo mật, thì cả Ed22519 và RSA đều rất an toàn và khó có thể bị bẻ cong. Về hiệu năng, Ed25519 vượt trội hơn RSA về tốc độ đăng nhập SSH nhờ quá trình ký và xác minh nhanh, ít tiêu tốn CPU, phù hợp cho server nhiều kết nối SSH.
Vậy tại sao RSA vẫn là phương thức xác thực phổ biến? Bởi thuật toán này tương thích rất tốt với hệ thống cũ, hỗ trợ rộng rãi trong nhiều ứng dụng. Tổng kết lại, nếu bạn sử dụng hệ thống hiện đại, có thể ưu tiên dùng Ed22519 vì nó nhanh hơn và nhẹ hơn.
Phần này hướng dẫn từng bước cách tạo và sử dụng SSH Key trên các hệ điều hành phổ biến.
Để tạo SSH Key trên macOS và Linux, bạn chỉ cần mở Terminal và sử dụng công cụ ssh-keygen. Quy trình gồm 3 bước chính:
Bước 1: Tạo cặp khóa trên máy
Mở Terminal và chạy lệnh:
ssh-keygen -t ed25519 -C "your_email@example.com"
Khi được hỏi vị trí lưu khóa, nhấn Enter để sử dụng vị trí mặc định:
~/.ssh/id_ed25519
Tiếp theo, nhập Passphrase để bảo vệ Private Key. Bạn nên sử dụng một Passphrase mạnh và dễ nhớ. Nếu bỏ trống, SSH Key vẫn hoạt động nhưng sẽ không có thêm lớp bảo vệ này.
Sau khi hoàn tất, hệ thống sẽ tạo hai file trong thư mục ~/.ssh:
id_ed25519: Private Key, cần được giữ bí mật.id_ed25519.pub: Public Key, dùng để thêm vào VPS hoặc dịch vụ Git.Lưu ý: Không thể khôi phục Passphrase nếu bạn quên. Khi đó, bạn cần tạo một cặp SSH Key mới và cập nhật Public Key trên các server đang sử dụng.
Bước 2: Sao chép Public Key lên VPS
Bạn có thể sử dụng một trong hai cách sau:
Cách 1: Sử dụng ssh-copy-id (khuyến nghị)
Chạy lệnh:
ssh-copy-id -i ~/.ssh/id_ed25519.pub ten_user@your_vps_ip
Nhập mật khẩu của ten_user trên VPS khi được yêu cầu. Public Key sẽ được tự động thêm vào server với cấu hình quyền phù hợp.
Cách 2: Sao chép thủ công
Hiển thị Public Key bằng lệnh:
cat ~/.ssh/id_ed25519.pub
Sao chép toàn bộ nội dung, sau đó đăng nhập vào VPS:
ssh ten_user@your_vps_ip
Trên VPS, tạo thư mục .ssh và thêm Public Key vào file authorized_keys:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "NỘI_DUNG_PUBLIC_KEY_BẠN_VỪA_COPY" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Bước 3: Đăng nhập bằng SSH Key
Sau khi Public Key đã được thêm vào VPS, đăng xuất và thử kết nối lại bằng lệnh:
ssh ten_user@your_vps_ip
Nếu cấu hình chính xác, hệ thống sẽ sử dụng SSH Key để xác thực và yêu cầu Passphrase của Private Key thay vì mật khẩu tài khoản VPS.
Trên Windows 10 phiên bản 1803 trở lên, OpenSSH Client đã được tích hợp sẵn trong hệ điều hành. Đây là phương pháp được khuyến nghị vì cách thực hiện tương tự macOS/Linux. Ngoài ra, bạn có thể sử dụng PuTTY nếu đang dùng phiên bản Windows cũ hoặc quen với công cụ này.
Bước 1: Mở PowerShell hoặc Command Prompt và tạo SSH Key
Mở PowerShell hoặc Command Prompt, sau đó chạy:
ssh-keygen -t ed25519 -C "your_email@example.com"
Khi được hỏi vị trí lưu key, nhấn Enter để sử dụng vị trí mặc định:
C:\Users\Ten_Nguoi_Dung\.ssh\id_ed25519
Tiếp theo, nhập Passphrase để bảo vệ Private Key.
Bước 2: Sao chép Public Key lên VPS
Nếu hệ thống hỗ trợ ssh-copy-id, sử dụng:
ssh-copy-id -i $env:USERPROFILE\.ssh\id_ed25519.pub ten_user@your_vps_ip
Nếu không có ssh-copy-id, dùng lệnh type để hiển thị Public Key:
type $env:USERPROFILE\.ssh\id_ed25519.pub
Sau đó sao chép toàn bộ nội dung và thêm vào file ~/.ssh/authorized_keys trên VPS.
Bước 3: Đăng nhập bằng SSH Key
Sau khi Public Key đã được thêm vào VPS, kết nối bằng:
ssh ten_user@your_vps_ip
Nếu cấu hình chính xác, SSH sẽ sử dụng Key để xác thực và yêu cầu Passphrase của Private Key nếu bạn đã thiết lập.
Nếu sử dụng PuTTY, bạn có thể tạo và sử dụng SSH Key thông qua PuTTYgen.
Bước 1: Tạo cặp khóa bằng PuTTYgen

Bước 2: Lưu Key và đặt Passphrase


Bước 3: Thêm Public Key lên VPS
Đăng nhập VPS bằng PuTTY và mật khẩu, sau đó thêm Public Key đã sao chép vào file:
~/.ssh/authorized_keys
Bạn có thể thực hiện tương tự phương pháp sao chép Public Key thủ công trên macOS/Linux.
Bước 4: Cấu hình PuTTY để đăng nhập bằng SSH Key




Mẹo: Chuyển đổi định dạng SSH Key
PuTTYgen cũng hỗ trợ chuyển đổi giữa các định dạng Key. Trong menu Conversions, bạn có thể sử dụng Import key để nhập Private Key của OpenSSH và lưu thành .ppk, hoặc dùng Export OpenSSH key để chuyển file .ppk sang định dạng OpenSSH.

Với SSH Key đã tạo theo hướng dẫn ở trên, bạn có thể thêm ssh public key vào tài khoản trên server (github, gitlab…).
Sao chép ssh key vào clipboard bằng lệnh:
cat ~/.ssh/id_rsa.pub
Bạn cũng có thể dùng lệnh sau để hiển thị nội dung file ssh-key và sao chép:
cat ~/.ssh/id_rsa.pub
Để thêm SSH Key vào GitHub, bạn thực hiện theo các bước sau:
Bước 1: Truy cập vào GitHub tại địa chỉ https://github.com/settings/profile.
Bước 2: Vào SSH and GPG keys, sau đó nhấn New SSH Key để thêm khóa mới.

Bước 3: Tại mục Title, nhập tên bất kỳ để đặt tên và dễ nhận diện SSH Key. Tại mục Key, dán nội dung Public Key đã sao chép trước đó.

Bước 4: Nhấn Add SSH Key để hoàn tất thêm SSH Key vào GitHub.
Bước 5: Kiểm tra kết nối SSH bằng lệnh:
ssh -T git@github.com
Nếu xác thực thành công, GitHub sẽ hiển thị thông báo tương tự:
Hi username! You’ve successfully authenticated, but GitHub does not provide shell access.
Thêm SSH Key vào GitHub
Để thêm SSH Key vào GitLab, bạn thực hiện tương tự như trên GitHub theo các bước sau:
Bước 1: Truy cập vào GitLab tại địa chỉ https://gitlab.com/-/profile/keys.
Bước 2: Dán nội dung Public Key đã sao chép vào ô Key.
Bước 3: Tại mục Title, nhập tên bất kỳ để dễ nhận diện SSH Key.
Bước 4: Nhấn Add key để hoàn tất việc thêm SSH Key vào GitLab.
Bước 5: Kiểm tra kết nối SSH bằng lệnh:
ssh -T git@gitlab.com
Nếu đây là lần đầu kết nối, SSH có thể hiển thị cảnh báo xác thực máy chủ. Bạn nhập yes và nhấn Enter để tiếp tục. Khi xác thực thành công, GitLab sẽ hiển thị thông báo tương tự:
Welcome to GitLab, @username!
Như vậy, SSH Key đã được thiết lập và bạn có thể sử dụng kết nối SSH với GitHub hoặc GitLab.

ssh-agent trên Linux/macOS/WSL và Pageant trên Windows với PuTTY là các chương trình chạy nền giúp lưu giữ Passphrase của SSH Key trong phiên làm việc. Nhờ đó, bạn chỉ cần nhập Passphrase một lần thay vì phải nhập lại mỗi khi sử dụng SSH Key.
Trên macOS/Linux/Windows-OpenSSH:
eval "$(ssh-agent -s)” để khởi động agent và thiết lập môi trường cho phiên Terminal hiện tại.ssh-add ~/.ssh/id_ed25519. Hệ thống sẽ yêu cầu bạn nhập Passphrase lần cuối.Trên Windows khi sử dụng PuTTY, chương trình tương ứng để quản lý SSH Key là Pageant:
Sau khi thiết lập SSH Key, bạn nên tiếp tục cứng hóa cấu hình SSH trên server bằng cách chỉnh sửa file /etc/ssh/sshd_config. Trước khi thực hiện, hãy mở sẵn một phiên Terminal đã đăng nhập thành công bằng SSH Key để tránh bị khóa quyền truy cập vào VPS.
Đây là bước quan trọng để loại bỏ phương thức xác thực bằng mật khẩu. Trong file /etc/ssh/sshd_config, đảm bảo các thiết lập sau:
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
Trong đó, PasswordAuthentication no vô hiệu hóa đăng nhập bằng mật khẩu; KbdInteractiveAuthentication no và ChallengeResponseAuthentication no tắt các phương thức xác thực tương tác có thể yêu cầu mật khẩu. UsePAM yes nên được giữ nguyên để không ảnh hưởng đến các chức năng xác thực khác và hỗ trợ triển khai những cơ chế bảo mật nâng cao như 2FA.
Vô hiệu hóa đăng nhập trực tiếp bằng tài khoản root là một biện pháp bảo mật cơ bản, giúp hạn chế rủi ro khi tài khoản quản trị bị tấn công. Trước khi thực hiện, hãy đảm bảo bạn đã có tài khoản người dùng thường được cấp quyền sudo để quản trị server.
Mở file /etc/ssh/sshd_config và thiết lập:
PermitRootLogin no
Thiết lập này sẽ ngăn tài khoản root đăng nhập trực tiếp qua SSH.
Để kiểm soát chặt chẽ quyền truy cập SSH, bạn có thể chỉ cho phép một nhóm người dùng cụ thể đăng nhập vào server. Ví dụ, chỉ cho phép người dùng thuộc nhóm sshusers:
AllowGroups sshusers
Sau khi hoàn tất các thiết lập trong /etc/ssh/sshd_config, khởi động lại dịch vụ SSH để áp dụng thay đổi:
sudo systemctl restart sshd
Trong quá trình tạo và sử dụng SSH Key, bạn có thể gặp một số lỗi liên quan đến tường lửa, quyền truy cập, khóa đã được sử dụng hoặc xác thực máy chủ. Dưới đây là các lỗi phổ biến và cách xử lý nhanh chóng.
Một số vấn đề lỗi có thể do cấu hình Firewall. Nếu firewall được thiết lập để chặn một số cổng hoặc dịch vụ nhất định, nó có thể ngăn bạn kết nối.
Trong trường hợp bạn đã thêm quy tắc firewall cho phép máy của bạn kết nối theo địa chỉ IP, hãy xác nhận rằng IP do nhà cung cấp dịch vụ Internet (ISP) cấp chưa thay đổi. Nếu IP thay đổi, bạn cần chỉnh sửa quy tắc firewall để cho phép IP mới hoặc dải địa chỉ mới.
Để kiểm tra quy tắc firewall, bạn sử dụng lệnh sau:
Ubuntu thường dùng UFW với lệnh: ufw status
CentOS thường dùng FirewallD: firewall-cmd –list-services
Còn lại sử dụng iptables với lệnh: iptables -nL

Lỗi “Permission to user/repo denied to other-user” có nghĩa là SSH key bạn đang dùng để push được gắn với một tài khoản không có quyền truy cập vào repository.
Để khắc phục, repository cần thêm tài khoản của bạn (other-user) làm collaborator cho repository, hoặc thêm bạn vào một team có quyền ghi đối với repository đó.

Lỗi “Error: Key already in use” xảy ra khi bạn cố gắng thêm một SSH key đã được gắn vào tài khoản hoặc repository khác trên Github.
Để xác định key đang được dùng ở đâu, mở terminal và chạy lệnh SSH. Dùng tham số -i để chỉ định đường dẫn tới key cần kiểm tra:
ssh -T -ai ~/.ssh/id_rsa git@github.com# Kết nối tới GitHub.com bằng SSH key cụ thể
Hi USERNAME! You’ve successfully authenticated, but GitHub does not provide shell access.
Trong trường hợp bạn muốn SSH chỉ sử dụng key bạn truyền trên dòng lệnh, dùng tùy chọn -o IdentitiesOnly=yes:
ssh -v -o “IdentitiesOnly=yes” -i ~/.ssh/id_rsa git@github.com

Lỗi “Host key verification failed” xuất hiện khi máy chủ mà bạn đang kết nối cung cấp một host key không trùng khớp với khóa đã được SSH ghi nhận trước đây.
Nguyên nhân do máy chủ thay đổi SSH key đột ngột. Trong trường hợp này, thường sẽ có thông báo chính thức từ nguồn đáng tin cậy xác nhận việc thay đổi.
Nếu sử dụng GitHub thay đổi SSH host key, thông tin sẽ được công bố trên GitHub Blog. Nếu bạn muốn kết nối SSH diễn ra bình thường, bạn thêm các SSH key này vào file known_hosts

Khi kết nối SSH tới dịch vụ fortrabbit lần đầu, hệ thống sẽ hiển thị một cảnh báo cho biết bạn đang truy cập vào một SSH server mới. Lúc này, bạn chỉ cần nhập yes để xác nhận, fingerprint của dịch vụ deploy fortrabbit sẽ được lưu lại trong file ~/.ssh/known_hosts.
Trong trường hợp fingerprint này bị thay đổi ở những lần kết nối sau, SSH sẽ báo lỗi để cảnh báo rủi ro, và bạn cần kiểm tra rồi xử lý tiếp tùy theo từng tình huống cụ thể.
Thông báo cảnh báo thường có dạng:
The authenticity of host ‘…’ can’t be established
RSA key fingerprint is …
Are you sure you want to continue connecting (yes/no)?
Với một số môi trường đặc thù, bạn có thể phải tự cấu hình hoặc chỉ rõ đường dẫn tới file known_hosts để quá trình kết nối diễn ra bình thường.

Để bảo vệ tài khoản và máy chủ khi sử dụng SSH Key, bạn nên tuân thủ một số nguyên tắc bảo mật quan trọng sau: