Cấu hình SSH Key cho GitLab

SSH (Secure Shell) là phương pháp xác thực an toàn và tiện lợi để tương tác với GitLab. Khi cấu hình xong, bạn có thể đẩy/méo mã mà không cần nhập mật khẩu, đồng thời đảm bảo kết nối được mã hóa đầu cuối. Hướng dẫn này bao gồm đầy đủ quy trình từ tạo khóa, thiết lập commit có chữ ký, hỗ trợ nhiều tài khoản đến xử lý sự cố thường gặp. > **Áp dụng cho**: cả GitLab.com và các phiên bản tự quản lý (Self-Managed). Các lệnh đã được kiểm thử trên Windows (Git Bash / PowerShell), macOS và Linux.

1. Chuẩn bị ban đầu

Trước khi bắt đầu, hãy đảm bảo:
MụcYêu cầuLệnh kiểm tra
GitĐã cài đặt (phiên bản ≥ 2.34)git --version
OpenSSHClient khả dụngssh -V
TerminalLinux/macOS: dùng terminal mặc định; Windows: dùng Git Bash hoặc PowerShell, tránh CMD
Tài khoản GitLabCó quyền đăng nhập và thêm SSH key
> Trong bài viết, ~/.ssh/ ám chỉ thư mục .ssh trong thư mục home của người dùng. Trên Windows, đường dẫn tương ứng là C:\Users\<username>\.ssh\.

2. Thiết lập nhanh (5 bước cơ bản)

Người dùng đã quen có thể làm theo các bước sau:
# 1. Tạo khóa Ed25519 (nhấn Enter để dùng đường dẫn mặc định, đặt passphrase)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 2. Sao chép public key
cat ~/.ssh/id_ed25519.pub        # Copy thủ công
# hoặc
clip < ~/.ssh/id_ed25519.pub     # Windows (Git Bash)
pbcopy < ~/.ssh/id_ed25519.pub   # macOS

# 3. Đăng nhập GitLab → Avatar → Edit profile → SSH Keys → Add new key → dán nội dung

# 4. Kiểm tra kết nối
ssh -T git@gitlab.com            # Phản hồi: "Welcome to GitLab, @username!"

# 5. Clone repo
git clone git@gitlab.com:username/repo.git
Gặp lỗi? Xem phần Xử lý sự cố ở cuối bài.

3. Tạo cặp khóa SSH

Mỗi cặp khóa gồm: - Private key: lưu cục bộ, tuyệt đối không chia sẻ. - Public key: tải lên GitLab.

3.1 Chọn loại khóa

LoạiKhuyến nghịGhi chú
Ed25519Ưu tiênAn toàn hơn, ngắn gọn, hiệu năng cao; được GitLab 14.8+ đề xuất
ECDSA (NIST)Dùng đượcCó tranh cãi về độ tin cậy của đường cong NIST
RSA (≥ 3072 bit)Tương thíchNên chọn 4096 bit nếu dùng RSA
DSA / RSA < 2048Cấm dùngĐã bị GitLab và OpenSSH loại bỏ

3.2 Lệnh tạo khóa

Kiểu Ed25519 (khuyến khích):
ssh-keygen -t ed25519 -C "your_email@example.com"
Kiểu RSA (cho hệ thống cũ):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Giải thích tham số:
Tham sốMô tả
-tLoại khóa (ed25519 hoặc rsa)
-b 4096Chỉ áp dụng cho RSA, chỉ định độ dài khóa
-CChú thích nhận diện (không ảnh hưởng chức năng)

3.3 Hiểu các lời nhắc

1. Đường dẫn lưu file: nhấn Enter để dùng mặc định: - Ed25519 → ~/.ssh/id_ed25519 - RSA → ~/.ssh/id_rsa 2. Passphrase: nên đặt để tăng bảo mật. Kết hợp với SSH Agent sẽ tránh nhập lại nhiều lần. 3. Thông báo thành công:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
> ⚠️ Lưu ý bảo mật: file có đuôi .pub là public key — có thể chia sẻ; file không đuôi là private key — tuyệt đối không tiết lộ.

4. Tải public key lên GitLab

4.1 Sao chép nội dung public key

Xem nội dung:
cat ~/.ssh/id_ed25519.pub
Sao chép nguyên văn, bao gồm phần đầu (`ssh-ed25519` hoặc `ssh-rsa`) và email cuối cùng. Lệnh sao chép nhanh theo hệ điều hành:
Hệ điều hànhLệnh
macOSpbcopy < ~/.ssh/id_ed25519.pub
Linux (X11)xclip -sel clip < ~/.ssh/id_ed25519.pub
Linux (Wayland)wl-copy < ~/.ssh/id_ed25519.pub
Windows (Git Bash)clip < ~/.ssh/id_ed25519.pub
Windows (PowerShell)Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard

4.2 Thêm vào GitLab

1. Đăng nhập → Nhấp avatar → Edit profile 2. Menu trái → SSH KeysAdd new key 3. Điền thông tin:
TrườngMô tả
KeyDán toàn bộ nội dung public key
TitleTên mô tả, ví dụ: MacBook-Pro-2024
Usage typeAuthentication & Signing (mặc định), hoặc riêng lẻ
Expiration dateNên đặt để luân chuyển khóa định kỳ
4. Nhấn Add key.

5. Kiểm tra kết nối SSH

# Với GitLab.com
ssh -T git@gitlab.com

# Với GitLab tự quản (thay domain phù hợp)
ssh -T git@gitlab.yourcompany.com
- Lần đầu kết nối sẽ hỏi xác nhận dấu vân máy chủ. So sánh với danh sách chính thức trước khi gõ yes. - Thành công: Welcome to GitLab, @username! - Nếu treo: thêm cờ -v để debug: ssh -Tv git@gitlab.com.

6. Cấu hình SSH Agent

SSH Agent lưu private key đã giải mã trong phiên làm việc, tránh nhập passphrase lặp.

6.1 Linux / macOS

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l  # Liệt kê khóa đã nạp
macOS (lưu vào Keychain):
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Thêm vào ~/.ssh/config:
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519

6.2 Windows

Bật dịch vụ ssh-agent (chạy PowerShell với quyền admin):
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
> (Tùy chọn) Ép Git dùng OpenSSH hệ thống: >
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"

7. Sử dụng hàng ngày

7.1 Clone dự án

git clone git@gitlab.com:username/repository.git
URL lấy từ nút Clone → Clone with SSH trên giao diện GitLab.

7.2 Chuyển từ HTTPS sang SSH

git remote set-url origin git@gitlab.com:username/repository.git
git remote -v  # Xác nhận thay đổi

7.3 Quản lý nhiều tài khoản / nhiều instance

Dùng file ~/.ssh/config để phân biệt:
# Công ty (self-hosted)
Host gitlab-work
  HostName gitlab.company.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
  IdentitiesOnly yes

# Cá nhân (GitLab.com)
Host gitlab-personal
  HostName gitlab.com
  User git
  IdentityFile ~/.ssh/id_ed25519_personal
  IdentitiesOnly yes
Khi clone:
git clone git@gitlab-work:group/project.git
git clone git@gitlab-personal:user/project.git
> IdentitiesOnly yes giúp SSH chỉ dùng đúng khóa được chỉ định, tránh thử tất cả khóa trong agent.

8. Nâng cao: Ký commit bằng SSH

Từ GitLab 15.7+, bạn có thể ký commit/tag bằng SSH key để hiển thị huy hiệu Verified.
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
git config --global tag.gpgsign true
> Yêu cầu: khi thêm public key vào GitLab, chọn Usage type bao gồm Signing.

9. Xử lý sự cố

9.1 Permission denied (publickey)

Kiểm tra theo thứ tự: 1. URL remote phải bắt đầu bằng git@, không phải https://git remote -v 2. Public key đã dán đúng, không bị ngắt dòng 3. Private key đã được nạp vào agent → ssh-add -l 4. Dùng ssh -Tv git@gitlab.com để xem SSH đang thử khóa nào 5. Kiểm tra quyền truy cập file (xem 9.5)

9.2 Không kết nối được do cổng 22 bị chặn

Nhiều mạng doanh nghiệp chặn cổng 22. GitLab.com hỗ trợ cổng 443 qua tên miền thay thế. Thêm vào ~/.ssh/config:
Host gitlab.com
  Hostname altssh.gitlab.com
  Port 443
  User git
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_ed25519
> Với GitLab tự quản, cần cấu hình tường lửa hoặc dùng HTTPS + Personal Access Token.

9.3 Vẫn yêu cầu nhập mật khẩu

- Nếu remote là HTTPS → chuyển sang SSH (xem 7.2) - Trên Windows: kiểm tra ssh-agent đã chạy chưa (xem 6.2)

9.4 Cảnh báo thay đổi host key

Nếu thấy: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 1. So sánh dấu vân mới với thông tin chính thức từ GitLab 2. Nếu hợp lệ, xóa bản ghi cũ: ssh-keygen -R gitlab.com 3. Kết nối lại và xác nhận fingerprint mới

9.5 Quyền truy cập file khóa quá rộng

Linux / macOS:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config
Windows: Chuột phải file private key → Properties → Security → Advanced → Disable inheritance → Chỉ giữ quyền "Full control" cho user hiện tại.

9.6 Không kết nối được với GitLab tự quản

Trên server GitLab, kiểm tra:
getent passwd git
Đầu ra phải trỏ về thư mục shell của GitLab (thường là /var/opt/gitlab/gitlab-shell). Đảm bảo sshd_config có:
PubkeyAuthentication yes
> Với bản cài Omnibus, không chỉnh sửa thủ công file ~git/.ssh/authorized_keys.

9.7 Quy trình luân chuyển khóa

1. Kiểm tra thời gian sử dụng gần nhất và hạn trên GitLab 2. Tạo khóa mới → tải lên → cập nhật IdentityFile cục bộ → kiểm thử → xóa khóa cũ trên GitLab → xóa private key cũ

10. Thực hành bảo mật tốt

Nguyên tắcLý do
Luôn đặt passphrase cho private keyKết hợp agent, trải nghiệm vẫn mượt
Mỗi thiết bị dùng một khóa riêngDễ thu hồi khi mất thiết bị
Đặt hạn sử dụng cho khóaBuộc luân chuyển định kỳ
Ưu tiên Ed25519Tránh thuật toán yếu
Không đồng bộ private key lên cloud/chat/GitRò rỉ = mất an toàn
Không chia sẻ khóa giữa nhiều ngườiKhông thể truy vết hành động cá nhân
Không thêm private key vào agent trên máy công cộngCó thể để lại dữ liệu nhạy cảm

Thẻ: gitlab ssh openssh Ed25519 RSA

Đăng vào ngày 12 tháng 6 lúc 18:47