skip to content
Thai Le
Cấu hình SSH key cho nhiều tài khoản GitHub — minh hoạ ~/.ssh/config, SSH key personal và work

Cấu hình SSH key cho nhiều tài khoản GitHub

/ 4 min read

Table of Contents

Lần đầu setup laptop mới, tôi muốn cả tài khoản chính lẫn tài khoản phụ (dùng cho mấy repo thử nghiệm) cùng chạy được trên một máy. Clone repo thứ nhất bình thường. Clone repo thứ hai — Permission denied (publickey). SSH không biết phải dùng key nào vì cả hai tài khoản đều trỏ về git@github.com.

Giải pháp là tạo nhiều SSH key và đặt alias trong ~/.ssh/config để mỗi tài khoản dùng đúng key của nó.

Tạo SSH key cho từng tài khoản

Terminal window
# Xem có key cũ chưa, tránh đặt trùng tên rồi ghi đè
ls -al ~/.ssh
# Tạo key personal
ssh-keygen -t ed25519 -C "personal@email.com" -f ~/.ssh/id_ed25519_github_personal
# Tạo key work
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_github_work

Nên đặt passphrase cho key. --apple-use-keychain sẽ lưu passphrase vào Keychain, không phải gõ lại mỗi lần — tiện như không passphrase nhưng vẫn an toàn nếu mất máy.

Dùng ed25519 thay vì rsa vì key ngắn hơn, ký nhanh hơn, và là chuẩn GitHub khuyến nghị hiện nay.

Nạp key vào ssh-agent

Terminal window
eval "$(ssh-agent -s)"
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_github_personal
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_github_work

Kiểm tra key đã nạp:

Terminal window
ssh-add -l

Cấu hình ~/.ssh/config

Host *
UseKeychain yes
AddKeysToAgent yes
# Personal account
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_personal
# Work account
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_work

Quan trọng: Host ở đây là alias (github.com-personal / github.com-work). Khi clone repo phải dùng alias tương ứng.

Thêm public key vào GitHub

Làm lần lượt từng key (nếu chạy cả 2 lệnh pbcopy liên tiếp thì chỉ key cuối còn trong clipboard):

Terminal window
# 1. Copy key personal
pbcopy < ~/.ssh/id_ed25519_github_personal.pub

Vào tài khoản personal trên GitHub → avatar → Settings → SSH and GPG keys → New SSH key → dán key vừa copy.

Terminal window
# 2. Copy key work
pbcopy < ~/.ssh/id_ed25519_github_work.pub

Vào tài khoản work → làm tương tự.

Kiểm tra kết nối

Terminal window
ssh -T git@github.com-personal
ssh -T git@github.com-work

Nếu thành công sẽ hiển thị:

Hi <username>! You've successfully authenticated...

Clone repo đúng alias

Terminal window
# Repo cá nhân
git clone git@github.com-personal:your-username/your-repo.git
# Repo work
git clone git@github.com-work:company/repo.git

Nếu repo đã clone bằng URL sai:

Terminal window
git remote set-url origin git@github.com-work:company/repo.git

Nguyên tắc dễ nhớ: không bao giờ dùng git@github.com:... mặc định nếu trên máy có nhiều account.

Cấu hình Git user/email tự động

Phần này dùng includeIf để mỗi repo tự dùng đúng email — tránh trường hợp commit nhầm email work vào repo personal (hoặc ngược lại, càng nguy hiểm).

File ~/.gitconfig (mặc định dùng personal):

[user]
name = Your Personal Name
email = personal@email.com
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "hasconfig:remote.*.url:git@github.com-work:"]
path = ~/.gitconfig-work

File ~/.gitconfig-work:

[user]
name = Your Work Name
email = work@company.com

Cách hoạt động:

  • Repo trong thư mục ~/work/ hoặc có remote URL chứa alias github.com-work → tự dùng email work
  • Repo khác → dùng email personal

Kiểm tra user/email trong repo

Terminal window
git config user.name
git config user.email

Xử lý lỗi thường gặp

Permission denied (publickey).
fatal: Could not read from remote repository.

Nguyên nhân & cách xử lý:

  1. Clone chưa dùng alias → sửa lại URL hoặc clone lại bằng github.com-work / github.com-personal
  2. Key chưa add vào ssh-agent → ssh-add --apple-use-keychain ~/.ssh/id_ed25519_github_work
  3. Public key chưa add vào GitHub
  4. Quyền file sai → chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
  5. Debug chi tiết → ssh -vT git@github.com-work

15 phút setup, đổi lấy việc không phải debug Permission denied mỗi lần thêm repo mới — và quan trọng hơn, không có commit nào lỡ tay ra dưới nhầm tên.