SSH Key là gì? Đăng nhập VPS không cần mật khẩu an toàn
Hướng dẫn tạo SSH key trên Windows, Linux và macOS, thêm public key vào VPS, cấu hình alias, permission và sửa lỗi publickey an toàn.
Bài viết bởi Phạm Minh Thiện
Front-end Developer, trực tiếp thực hành Next.js, NestJS, Docker, Nginx và VPS Ubuntu.
Bài viết đã được kiểm tra lại ngày 21/7/2026.
Mục lục bài viết

SSH Key là gì? SSH key là cặp khóa public–private dùng để xác thực khi đăng nhập VPS mà không gửi mật khẩu qua mỗi phiên kết nối. Public key được đặt trong authorized_keys trên server; private key phải ở lại máy cá nhân và nên được bảo vệ bằng passphrase.
Hướng dẫn này áp dụng cho PowerShell, Linux và macOS: tạo khóa ED25519, copy public key lên VPS, sửa permission, tạo SSH alias, kiểm tra bằng chế độ verbose và chỉ tắt đăng nhập mật khẩu sau khi đã thử key trong một terminal mới.
Tóm tắt nhanh: Giữ private key bí mật; chỉ copy file
.pub; đặt~/.sshlà 700 vàauthorized_keyslà 600; kiểm tra user/owner; giữ phiên cũ khi thay đổi cấu hình SSH.

Demo terminal: xác nhận đúng key trước khi tắt mật khẩu
Mở một terminal thứ hai và chỉ định rõ private key. Khi đăng nhập thành công, kiểm tra sudo, sau đó mới cân nhắc tắt PasswordAuthentication. Không đóng phiên quản trị cũ trong lúc thử.

ssh -i ~/.ssh/id_ed25519 -v deploy@203.0.113.10
id
sudo whoami
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
sudo sshd -t
Lưu ý: Output trong ảnh và ví dụ là demo lab đã ẩn thông tin nhạy cảm. Khi chụp terminal thật, hãy che IP quản trị, username nội bộ, token, private key, mật khẩu và chuỗi kết nối database.
SSH là gì?
SSH là viết tắt của Secure Shell. Đây là giao thức đăng nhập và chạy lệnh từ xa qua kết nối mã hóa.
ssh user@server-ip
Ví dụ:
ssh thien@203.0.113.10
SSH mặc định thường dùng port 22.
SSH key là gì?
SSH key là một cặp khóa:
Private key → giữ bí mật trên máy cá nhân
Public key → đặt trên VPS
Server lưu public key được phép trong:
~/.ssh/authorized_keys
Khi đăng nhập:
- Client đưa ra public key muốn dùng.
- Server kiểm tra key có được cho phép không.
- Client chứng minh mình sở hữu private key tương ứng.
- Private key không được gửi lên server.
Private key và public key
Private key
Ví dụ:
~/.ssh/id_ed25519
Không được:
- Gửi cho người khác.
- Dán lên chat.
- Commit Git.
- Đặt trong source project.
- Lưu công khai.
Nên bảo vệ bằng passphrase.
Public key
Ví dụ:
~/.ssh/id_ed25519.pub
Nội dung có dạng:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... laptop
Public key có thể đặt trên nhiều server.
Tạo SSH key trên Windows
Mở PowerShell:
ssh-keygen -t ed25519 -C "deployeasy-laptop"
Nhấn Enter để dùng đường dẫn mặc định:
C:\Users\YourName\.ssh\id_ed25519
Sau đó nhập passphrase.
Xem public key:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
Tạo SSH key trên Linux/macOS
ssh-keygen -t ed25519 -C "deployeasy-laptop"
File:
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
Xem:
cat ~/.ssh/id_ed25519.pub
Thêm public key vào VPS
Dùng ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub thien@203.0.113.10
Thêm thủ công
Đăng nhập bằng mật khẩu:
ssh thien@203.0.113.10
Tạo thư mục:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
Mở:
nano ~/.ssh/authorized_keys
Dán toàn bộ public key trên một dòng:
chmod 600 ~/.ssh/authorized_keys
Kiểm tra owner:
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
Nếu sai:
sudo chown -R thien:thien /home/thien/.ssh
Gửi từ PowerShell
type $env:USERPROFILE\.ssh\id_ed25519.pub |
ssh thien@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Chỉ dùng file .pub, không gửi private key.
Kiểm tra đăng nhập
Windows:
ssh -i $env:USERPROFILE\.ssh\id_ed25519 thien@203.0.113.10
Linux/macOS:
ssh -i ~/.ssh/id_ed25519 thien@203.0.113.10
Nếu key ở đường dẫn mặc định:
ssh thien@203.0.113.10
Vì sao chỉ định sai tên key vẫn đăng nhập được?
Ví dụ:
ssh -i ~/.ssh/id_ed25520 thien@server
File không tồn tại nhưng SSH vẫn có thể:
- Thử key mặc định.
- Dùng key từ ssh-agent.
- Đọc key trong config.
- Chuyển sang đăng nhập mật khẩu.
Xem chi tiết:
ssh -vvv thien@203.0.113.10
Tìm:
Offering public key
Server accepts key
Authenticated to
SSH agent
SSH agent giữ key trong bộ nhớ để giảm số lần nhập passphrase.
Linux/macOS:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
Windows:
Get-Service ssh-agent
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
Tạo SSH alias
Windows:
C:\Users\YourName\.ssh\config
Linux/macOS:
~/.ssh/config
Nội dung:
Host deployeasy-vps
HostName 203.0.113.10
User thien
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Kết nối:
ssh deployeasy-vps
SCP:
scp file.txt deployeasy-vps:/home/thien/
Host và HostName
Host: alias tự đặt.HostName: IP hoặc domain thật.
Không viết placeholder:
HostName server-ip
nếu chưa thay bằng IP thật.
Permission chuẩn
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Kiểm tra cả đường dẫn:
namei -l ~/.ssh/authorized_keys
OpenSSH có thể từ chối key nếu thư mục hoặc file cho phép user khác ghi.
Tắt đăng nhập mật khẩu
Chỉ thực hiện sau khi:
- User sudo hoạt động.
- SSH key đăng nhập thành công.
- Đã test từ terminal thứ hai.
- Có console khôi phục của nhà cung cấp.
Tạo file:
sudo nano /etc/ssh/sshd_config.d/99-deployeasy.conf
Ví dụ:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
Kiểm tra:
sudo sshd -t
Reload:
sudo systemctl reload ssh
Giữ phiên hiện tại mở rồi thử đăng nhập lại.
Có nên đổi port SSH?
Đổi port giúp giảm bot quét port 22 nhưng không thay thế:
- SSH key.
- Firewall.
- Update.
- Least privilege.
- Monitoring.
Nếu đổi port, phải mở port mới trên firewall trước khi reload SSH.
Lỗi Permission denied (publickey)
Sai user
Key nằm ở:
/home/thien/.ssh/authorized_keys
nhưng bạn đăng nhập user khác.
Sai key
ssh -i ~/.ssh/id_ed25519 thien@server
Public key bị xuống dòng
Mỗi key phải nằm trọn trên một dòng.
Permission sai
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$USER":"$USER" ~/.ssh
Home directory sai
getent passwd thien
ls -ld /home/thien
Xem log
sudo journalctl -u ssh --since "10 minutes ago"
Cảnh báo host key changed
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Đây là host key của server, không phải key đăng nhập user.
Nguyên nhân hợp lệ:
- VPS được cài lại.
- IP được cấp cho máy khác.
- Host key được tạo lại.
Cũng có thể là kết nối bị can thiệp. Hãy xác minh fingerprint qua console hoặc nhà cung cấp trước.
Sau khi xác minh:
ssh-keygen -R 203.0.113.10
Dùng nhiều key
id_ed25519_personal
id_ed25519_work
id_ed25519_deployeasy
Config:
Host deployeasy-vps
HostName 203.0.113.10
User thien
IdentityFile ~/.ssh/id_ed25519_deployeasy
IdentitiesOnly yes
Key riêng giúp thu hồi dễ hơn.
Khi private key bị lộ
- Tạo key mới.
- Thêm public key mới.
- Test đăng nhập.
- Xóa public key cũ khỏi tất cả server.
- Kiểm tra log.
- Thu hồi key khỏi CI/CD hoặc dịch vụ liên quan.
Checklist
[ ] Tạo Ed25519 key
[ ] Đặt passphrase
[ ] Chỉ copy public key
[ ] .ssh permission 700
[ ] authorized_keys permission 600
[ ] Test ở terminal thứ hai
[ ] Có console khôi phục
[ ] Chỉ tắt password sau khi test
[ ] Không commit private key
[ ] Dùng key riêng cho CI/CD
[ ] Thu hồi key không còn sử dụng
Câu hỏi thường gặp
Một key dùng cho nhiều VPS được không?
Có, nhưng key riêng theo mục đích giúp thu hồi và kiểm soát tốt hơn.
authorized_keys chứa nhiều key được không?
Có. Mỗi key thường nằm trên một dòng.
SSH key có hết hạn không?
Key OpenSSH thông thường không tự hết hạn. Bạn cần quy trình xoay vòng và thu hồi.
Quên passphrase có lấy lại được không?
Không. Hãy dùng phương thức truy cập khác để thêm key mới.
Bài viết liên quan
- Cấu hình VPS Ubuntu mới
- Sửa lỗi SSH Permission denied và Host Key Changed
- GitHub Actions deploy VPS qua SSH
- Deploy Node.js bằng PM2 và Nginx
Kết luận
SSH key an toàn khi private key được bảo vệ, permission đúng, user được giới hạn quyền và key cũ được thu hồi kịp thời.
Nguồn tham khảo
Đọc tiếp
Bài viết liên quan
Sửa lỗi SSH Permission denied (publickey) và Host Key Changed an toàn
Quy trình kiểm tra đúng user, private key, authorized_keys, quyền file và xác minh host key trước khi xóa known_hosts.
Đọc bài →GitHub Actions CI/CD: Tự động deploy Node.js lên VPS
Tạo GitHub Actions CI/CD để build, test và tự động deploy Node.js lên VPS qua SSH an toàn, có secrets, healthcheck, concurrency và rollback.
Đọc bài →Mới mua VPS Ubuntu cần làm gì? 20 bước cấu hình production
Checklist cấu hình VPS Ubuntu mới: user sudo, SSH key, UFW, cập nhật bảo mật, swap, backup và monitoring trước khi deploy website.
Đọc bài →