Cách tạo SSH key cho GitHub GitLab đầy đủ từ A đến Z

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.

Sơ đồ giao thức SSH minh họa client-server authentication với public/private key

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.

Màn hình terminal hiển thị lệnh ssh-keygen và kết quả tạo key ED25519

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

  1. Title: Tên mô tả (ví dụ: “MacBook Pro ED25519”)
  2. Key type: Authentication Key
  3. Key: Dán toàn bộ public key (bắt đầu bằng ssh-ed25519 hoặc ssh-rsa)
  4. Click Add SSH key

GitLab: User Settings → SSH Keys

  1. Key: Dán public key
  2. Title: Tên mô tả
  3. Expiration date: Tùy chọn (khuyên dùng 1 năm)
  4. Usage: Authentication (mặc định), Signing, hoặc Both
  5. 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!"

Giao diện Settings SSH Keys trên GitHub hiển thị danh sách key đã thêm

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 -lssh -T [email protected]

Nguồn tham khảo: GitHub SSH Documentation | GitLab SSH Documentation | OpenSSH Manual

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Cách chụp màn hình Android: Toàn bộ phương pháp từ cơ bản đến nâng cao

Cách chụp màn hình Android: Toàn bộ phương pháp từ cơ bản đến nâng cao Chụp màn hình Android (screenshot) là thao tác cơ bản nhưng có nhiều cách thực…

Xem thêm

Dev Container Standard: Setup VS Code Remote Containers cho Team

Dev Container Standard: Setup VS Code Remote Containers cho Team Consistency “Tôi chạy được trên máy mình” là một trong những nguyên nhân phổ biến nhất gây mất thời gian…

Xem thêm

iOS 18 App Locking & Hidden Apps: Face ID khóa ứng dụng

iOS 18 App Locking & Hidden Apps: Face ID khóa ứng dụng, ẩn khỏi màn hình chính iOS 18 mang đến hai tính năng bảo mật quan trọng mà người…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất