Skip to content

SSH và xác thực khóa

💡 Hướng dẫn học: Mỗi lần git push lại nhập mật khẩu? SSH connect server luôn bị "Permission denied"? Chương này giúp bạn hiểu nguyên lý xác thực khóa SSH trong 5 phút, và cách cấu hình đăng nhập không cần mật khẩu GitHub và server chỉ bằng một lệnh.


0. Bạn hẳn đã gặp những tình huống này

  • git push liên tục hiện hộp nhập mật khẩu, rất phiền
  • SSH kết nối server thất bại, không biết id_rsaid_ed25519 là gì
  • Nghe nói "khóa công khai" và "khóa riêng", nhưng không rõ cái nào cho người khác, cái nào giữ lại

Mâu thuẫn cốt lõi: Mật khẩu không an toàn, lại phiền. Khóa SSH là giải pháp giải quyết cùng lúc tính bảo mật và tiện lợi.


1. Mật khẩu vs Khóa: Tại sao khóa tốt hơn?

👇 Thử click: So sánh sự khác biệt giữa đăng nhập bằng mật khẩu và bằng khóa

SSH Key Authentication: Your Digital IDSymmetric vs asymmetric encryption · key pair generation · authentication flow
🔑
Password login
1Enter username and password
2Password is sent to the server over the network
3Server checks whether the password is correct
4You must enter the password every time
⚠️The password travels over the network and may be intercepted
🔐
Key login
1Put the public key on the server in advance
2Send identity when connecting, without sending the private key
3Server asks a mathematical challenge with the public key
4Your private key answers locally and only sends the answer
The private key never leaves your computer
Core idea:SSH key login is safer than passwords because the private key never travels over the network and cannot be stolen by a man-in-the-middle.

💡 Tóm tắt trong một câu

Đăng nhập mật khẩu = Mỗi lần gửi mật khẩu cho đối phương kiểm tra (có thể bị chặn); Đăng nhập khóa = Chứng minh "tôi có chìa" nhưng không cần đưa chìa cho bạn xem (khóa riêng không bao giờ truyền).


2. Mã hóa bất đối xứng: Khóa công khai và khóa riêng

Khóa SSH dựa trên mã hóa bất đối xứng, tạo một lúc hai chìa:

Khóa riêng (Private Key)Khóa công khai (Public Key)
Vị trí lưuMáy bạn ~/.ssh/id_ed25519Server/GitHub
Có thể cho người khác không❌ Tuyệt đối không✅ Tùy ý
Chức năngKý (chứng minh danh tính)Xác minh (kiểm tra danh tính)
Ví dụChìa khóaỔ khóa

Các loại khóa phổ biến

LoạiLệnhKhuyến nghịGhi chú
Ed25519ssh-keygen -t ed25519⭐⭐⭐Mới nhất, nhanh nhất, an toàn nhất
RSAssh-keygen -t rsa -b 4096⭐⭐Tương thích tốt nhưng chậm hơn
ECDSAssh-keygen -t ecdsaThường không khuyến nghị

3. Thực hành: Tạo và cấu hình khóa SSH

3.1 Tạo cặp khóa

bash
ssh-keygen -t ed25519 -C "your@email.com"

Sau khi chạy sẽ hỏi:

  • Đường dẫn tệp: Enter dùng mặc định ~/.ssh/id_ed25519
  • Passphrase: Có thể đặt bảo vệ thêm (hoặc để trống)

3.2 Thêm khóa công khai vào GitHub

bash
# 1. Copy nội dung khóa công khai
cat ~/.ssh/id_ed25519.pub | pbcopy  # macOS
cat ~/.ssh/id_ed25519.pub | xclip   # Linux

# 2. Mở GitHub → Settings → SSH and GPG keys → New SSH key
# 3. Dán khóa công khai, lưu

# 4. Test kết nối
ssh -T git@github.com
# Thành công sẽ thấy: Hi username! You've been authenticated...

3.3 Thêm khóa công khai vào server

bash
# Cách 1: ssh-copy-id (khuyến nghị)
ssh-copy-id user@your-server

# Cách 2: Copy thủ công
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

4. SSH Config: Tạm biệt lệnh dài

Cấu hình alias trong ~/.ssh/config, cấu hình một lần dùng mãi mãi:

Host dev
  HostName 192.168.1.100
  User deploy
  IdentityFile ~/.ssh/id_ed25519

Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519

Kết quả sau cấu hình:

TrướcSau
ssh -i ~/.ssh/id_ed25519 deploy@192.168.1.100ssh dev
Mỗi lần phải nhớ IP và usernameNhớ alias là đủ

5. Khắc phục vấn đề phổ biến

Vấn đềNguyên nhânGiải pháp
Permission denied (publickey)Chưa thêm khóa công khai lên serverssh-copy-id user@server
WARNING: UNPROTECTED PRIVATE KEY FILEQuyền file khóa riêng quá rộngchmod 600 ~/.ssh/id_ed25519
Could not resolve hostnameCấu hình SSH Config saiKiểm tra format ~/.ssh/config
GitHub vẫn hỏi mật khẩuDùng HTTPS chứ không phải SSHDùng git@github.com:user/repo.git

6. Tóm tắt

📚 Điểm chính

  1. Khóa > Mật khẩu: Khóa riêng không bao giờ truyền, an toàn hơn mật khẩu rất nhiều
  2. Khuyến nghị Ed25519: Thuật toán khóa hiện đại nhất, nhanh và an toàn
  3. Khóa công khai cho tùy ý, khóa riêng tuyệt đối không để lộ: Nhớ quy tắc vàng này
  4. SSH Config: Cấu hình alias một lần, sau đó ssh alias kết nối một lệnh
  5. GitHub/GitLab: Thêm khóa công khai xong, git push/pull không cần nhập mật khẩu nữa

Học tiếp: