Skip to content

Giới thiệu về 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_rsa và id_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: Động lực của 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 ecdsa⭐Thườ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: