Khi Git từ chối truy cập
Bạn vừa hoàn thành một tính năng khó, nhấn git push, và thay vì thấy mã nguồn được đẩy lên thành công, terminal lại trả về một lời từ chối thẳng thừng. Quá trình dừng lại với một thông báo kết thúc bằng:
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
Đây không phải là lỗi trong code của bạn. Đó là một rào cản xác thực. GitHub (hoặc GitLab/Bitbucket) đơn giản là không nhận diện được máy tính của bạn. Thông thường, nguyên nhân là do thiếu khóa (key), sai lỗi chính tả trong URL remote, hoặc quyền hạn file cục bộ đang để quá lỏng lẻo.
Đầu tiên: Kiểm tra kết nối
Trước khi bắt đầu tạo lại các khóa, hãy kiểm tra xem bạn có thực sự kết nối được với nhà cung cấp hay không. Chạy lệnh này để xem GitHub nhận diện bạn như thế nào:
ssh -T git@github.com
Nếu bạn thấy thông báo thành công như "Hi username! You've successfully authenticated...", khóa của bạn đang hoạt động tốt. Vấn đề có khả năng là do sai sót trong URL remote. Nếu terminal lặp lại lỗi Permission denied (publickey), hãy đọc tiếp.
Bước 1: Tìm các khóa hiện có
Nhiều lập trình viên đã có sẵn khóa nhưng không sử dụng đúng tên file. Hãy liệt kê thư mục .ssh để xem hiện có những gì:
ls -al ~/.ssh
Kiểm tra các file như id_ed25519.pub hoặc id_rsa.pub. Nếu thư mục trống hoặc thiếu các file kết thúc bằng .pub, bạn cần tạo một cặp khóa mới.
Bước 2: Tạo khóa SSH hiện đại
Nếu bạn bắt đầu từ đầu, hãy tạo khóa Ed25519. Chúng nhanh hơn, bảo mật hơn và ngắn hơn nhiều (khoảng 68 ký tự) so với các khóa RSA cũ.
ssh-keygen -t ed25519 -C "your_email@example.com"
Khi terminal hỏi nơi lưu khóa, nhấn Enter để chấp nhận đường dẫn mặc định. Bạn có thể thêm mật khẩu (passphrase) để tăng cường bảo mật, mặc dù nhiều lập trình viên thường để trống để thao tác thuận tiện hơn.
Bước 3: Đăng ký khóa với nhà cung cấp
Bây giờ bạn phải thông báo cho máy chủ về khóa công khai (public key) của mình. Lưu ý: tuyệt đối không chia sẻ khóa riêng tư (private key - file không có phần mở rộng .pub).
Sao chép nội dung khóa công khai vào clipboard:
# macOS
pbcopy `git remote set-url origin git@github.com:user/repo.git`
- **Sự phức tạp của WSL:** Nếu bạn sử dụng Windows Subsystem for Linux, hãy nhớ rằng các khóa bên trong Linux tách biệt với các khóa trong Windows PowerShell. Thông thường bạn nên chọn một môi trường và nhất quán sử dụng nó.
## Tổng kết
Việc sửa lỗi `Permission denied (publickey)` thường gói gọn trong ba điều: có một khóa hợp lệ, khai báo nó với máy chủ và giữ quyền hạn cục bộ nghiêm ngặt. Khi bài kiểm tra `ssh -T` trả về lời chào, bạn có thể quay lại công việc đẩy code mà không còn phải lo lắng về xác thực.

