
SSH key là cách xác thực an toàn nhất khi làm việc với GitHub và GitLab. Thay vì nhập password mỗi lần push/pull, SSH key cho phép xác thực tự động, an toàn hơn HTTPS và hỗ trợ tự động hóa CI/CD. Bài viết này hướng dẫn đầy đủ từ tạo key ed25519, thêm vào tài khoản, đến quản lý nhiều key trên Windows, macOS, Linux.
Vào năm 2024-2025, GitHub và GitLab đều khuyến nghị dùng ED25519 thay vì RSA nhờ bảo mật cao hơn, hiệu năng tốt hơn, và kích thước key nhỏ gọn. GitHub đã ngừng hỗ trợ DSA từ 3/2022 và yêu cầu RSA phải dùng SHA-2 signature sau 11/2021.

Tại sao dùng SSH key thay vì HTTPS?
- Bảo mật cao hơn: Private key không bao giờ rời khỏi máy tính, password không gửi qua mạng
- Tiện lợi: Không nhập password mỗi lần git push/pull/fetch
- Tự động hóa: CI/CD pipelines, deployment scripts cần xác thực không tương tác
- Hỗ trợ đa khóa: Quản lý riêng key cho work/personal, deploy keys, hardware keys
Tạo SSH key ED25519 cho GitHub và GitLab
So sánh ED25519 vs RSA
| Tiêu chí | ED25519 (Khuyên dùng) | RSA 4096-bit |
|---|---|---|
| Bảo mật | Cao hơn (curve25519) | Tốt nhưng kém hơn ED25519 |
| Hiệu năng | Nhanh hơn đáng kể | Chậm hơn |
| Kích thước key | Nhỏ gọn (512 bits) | Lớn hơn (4096 bits) |
| Hỗ trợ | Tất cả OS hiện đại, GitHub/GitLab khuyến nghị | Hệ thống cũ (legacy) |
Lệnh tạo key (Windows/macOS/Linux)
Mở Terminal (PowerShell/Git Bash trên Windows):
# ED25519 - Khuyến nghị cho 2024-2026
ssh-keygen -t ed25519 -C "[email protected]"
# RSA 4096-bit - Chỉ nếu hệ thống cũ không hỗ trợ ED25519
ssh-keygen -t rsa -b 4096 -C "[email protected]"
Khi được hỏi Enter file in which to save the key, nhấn Enter để dùng mặc định (~/.ssh/id_ed25519). Nhập passphrase mạnh (khuyên dùng) để bảo vệ private key nếu máy bị mất.

Thêm SSH key vào ssh-agent
ssh-agent lưu private key trong bộ nhớ, tránh nhập passphrase lặp lại.
# Khởi động ssh-agent
eval "$(ssh-agent -s)"
# Thêm key vào agent
ssh-add ~/.ssh/id_ed25519
# macOS: lưu passphrase vào Keychain
ssh-add -K ~/.ssh/id_ed25519
Windows 10/11: Dùng OpenSSH Authentication Agent service hoặc Git Bash ssh-agent. PowerShell:
Get-Service -Name ssh-agent | Set-StartupType -StartupType Automatic
Start-Service ssh-agent
ssh-add ~/.ssh/id_ed25519
Thêm public key vào GitHub và GitLab
Lấy public key
cat ~/.ssh/id_ed25519.pub
# Kết quả: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... [email protected]
GitHub: Settings → SSH and GPG keys → New SSH key
- Title: Tên mô tả (ví dụ: “MacBook Pro ED25519”)
- Key type: Authentication Key
- Key: Dán toàn bộ public key (bắt đầu bằng
ssh-ed25519hoặcssh-rsa) - Click Add SSH key
GitLab: User Settings → SSH Keys
- Key: Dán public key
- Title: Tên mô tả
- Expiration date: Tùy chọn (khuyên dùng 1 năm)
- Usage: Authentication (mặc định), Signing, hoặc Both
- Click Add key
Lưu ý bảo mật: GitLab tự động kiểm tra key với danh sách các key bị lộ (compromised keys) và từ chối nếu khớp.
Kiểm tra kết nối SSH
# Test GitHub
ssh -T [email protected]
# Kết quả: "Hi username! You've successfully authenticated..."
# Test GitLab
ssh -T [email protected]
# Kết quả: "Welcome to GitLab, @username!"

Quản lý nhiều SSH key với ~/.ssh/config
Khi có nhiều tài khoản (work/personal) hoặc nhiều key cho mục đích khác nhau, file ~/.ssh/config giúp chỉ định key cho từng host.
# ~/.ssh/config
# Tài khoản GitHub cá nhân
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
# Tài khoản GitLab công việc
Host gitlab.com-work
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
# GitHub mặc định (fallback)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_default
IdentitiesOnly yes
Sử dụng:
git clone [email protected]:username/repo.git
git clone [email protected]:username/repo.git
Quy tắc tốt: chmod 600 ~/.ssh/config, dùng IdentitiesOnly yes để tránh agent thử tất cả key.
Xử lý sự cố kết nối SSH phổ biến
| Lỗi | Nguyên nhân & Giải pháp |
|---|---|
| Permission denied (publickey) | Key chưa add vào ssh-agent (ssh-add -l để kiểm tra), sai key trong tài khoản, hoặc sai IdentityFile trong config |
| Agent admitted failure to sign | Key chưa load vào agent. Chạy ssh-add ~/.ssh/id_ed25519, restart agent nếu cần |
| Host key verification failed | Xóa key cũ: ssh-keygen -R github.com, chấp nhận key mới khi kết nối lần đầu |
| Cần key riêng cho repo cụ thể | Dùng GIT_SSH_COMMAND="ssh -i ~/.ssh/specific_key" git clone ... hoặc config ~/.ssh/config |
Best Practices 2024-2026 tóm tắt
- Luôn dùng ED25519 cho key mới
- Luôn đặt passphrase mạnh cho private key
- Quay vòng (rotate) key hàng năm hoặc khi nghi ngờ bị lộ
- Dùng key riêng cho work/personal/CI/CD
- Set expiration date trên GitLab nếu có thể
- Dùng deploy keys (read-only) cho CI/CD thay vì user SSH key
- Kiểm tra định kỳ:
ssh-add -lvàssh -T [email protected]
Nguồn tham khảo: GitHub SSH Documentation | GitLab SSH Documentation | OpenSSH Manual
