Cách xác thực Github bằng SSH
Github cung cấp hai cách để xác thực kho lưu trữ của bạn: qua HTTPS bằng mật khẩu và qua SSH bằng khóa riêng. Mặc dù cả hai cách đều hoạt động tốt, nhưng nếu bạn muốn chuyển đổi xác thực Github bằng SSH, bạn sẽ cần phải định cấu hình kho lưu trữ của mình để sử dụng thông tin đăng nhập mới.
Cấu hình xác thực Github bằng SSH
Github mặc định xác thực HTTPS, sử dụng mật khẩu cho tài khoản Github của bạn. Bất cứ khi nào bạn sao chép một repo, bạn sẽ phải chọn thủ công “SSH” làm tùy chọn cho sao chép URL.
Mặc dù SSH thường là tốt nhất để xác thực kết nối với máy chủ Linux, Github khuyến nghị HTTPS vì nó dễ sử dụng và ít gây nhầm lẫn hơn. Tuy nhiên, cách này khá tệ đối với tự động hóa, không an toàn về mặt kỹ thuật như khóa RSA và có thể gây khó chịu khi phải gõ mật khẩu mỗi lần, ngay cả với bộ nhớ đệm thông tin xác thực.
Để chuyển đổi khá đơn giản — bạn sẽ cần tạo khóa SSH mới nếu chưa có, thêm khóa đó vào tài khoản của bạn, sau đó hoán đổi repo cục bộ của bạn sang endpoint mới nếu bạn đã clone.
Đầu tiên, hãy kiểm tra xem bạn đã có khóa SSH chưa. Khóa mặc định của bạn thường được lưu trữ tại đây trên Linux/macOS:
cat ~/.ssh/id_rsa.pub
Trên Windows, còn phụ thuộc vào chương trình bạn đang sử dụng. Key đôi khi được lưu trữ trong %HOMEDRIVE%%HOMEPATH%.ssh, nhưng có thể khác dựa trên cách bạn đang sử dụng Git. Trong hầu hết các trường hợp, mình khuyên bạn nên sử dụng Windows Subsystem For Linux (WSL) hoạt động giống như một máy ảo và lưu trữ key trong môi trường Linux.
Nếu chưa có, bạn có thể tạo một cái bằng ssh-keygen:
ssh-keygen -t rsa -f ~/.ssh/id_rsa
Sau khi bạn có key, hãy vào cài đặt Github trong “SSH and GPG Keys” và dán nội dung của id_rsa.pub vào một khóa mới.
Sau khi hoàn tất, bạn sẽ được xác thực, miễn là Git được thiết lập để sử dụng khóa này.
Chuyển Repo HTTPS sang xác thực SSH
Nếu bạn sao chép từ Github bằng HTTPS, thì kho lưu trữ của bạn sẽ được liên kết với Github bằng cách sử dụng URL từ xa đó. Để khắc phục sự cố này, bạn cần phải xóa HTTPS remote, thường được gọi là origin và thêm lại nó bằng URI git@github thích hợp cho việc sử dụng SSH.
git remote rm origin git remote add origin [email protected]:user/repo.git
Sau đó push origin như bình thường:
git fetch origin git push --set-upstream origin/master
Nếu bạn đang sao chép một repo mới, bạn chỉ cần đảm bảo rằng nó được đặt thành “SSH” trong tương lai và URI được định cấu hình là [email protected].
Sử dụng một Key SSH khác
Tuy nhiên, nếu bạn có nhiều key SSH cần sử dụng, mọi thứ có thể trở nên phức tạp, đó là lý do tại sao Github đề xuất mật khẩu cho người mới. Giả sử bạn sao chép repo trên PC của mình, nhưng sau đó muốn làm việc từ Laptop của bạn. Bạn phải thêm key mới vào tài khoản Github của mình hoặc chuyển key sang Laptop.
Nếu có thể, bạn nên thêm key mới. Github hỗ trợ nhiều key vì một số lý do và bạn có thể đặt tên để sắp xếp key. Tuy nhiên, đôi khi, bạn sẽ chỉ có một key và cần phải chỉnh sữa mọi thứ ở phía client.
Nếu bạn chỉ muốn sử dụng cùng một key, bạn có thể chuyển id_rsa và id_rsa.pub sang máy mới. Tuy nhiên, nếu máy đó đã có key SSH riêng, bạn sẽ cần sử dụng nhiều key.
Bạn có thể làm điều đó bằng cách chỉnh sửa tệp cấu hình máy chủ của SSH:
nano ~/.ssh/config
Thêm hai khối có tên khác nhau. Trong trường hợp này, nó đang thiết lập các khóa khác nhau cho tài khoản cá nhân và tài khoản công ty.
Host personal Hostname github.com IdentityFile ~/.ssh/githubpersonal IdentitiesOnly yes Host work Hostname github.com IdentityFile ~/.ssh/githubwork IdentitiesOnly yes
Bạn sẽ cần hai khóa có tên githubpersonal.pub và githubwork.pub hoặc bất kỳ tên nào bạn chọn để đặt cho chúng. Cuối cùng, bạn sẽ cần xóa remote và thêm lại, chỉ định tên của khối trong tệp cấu hình máy chủ (có thể không khớp với tên khóa):
git remote rm origin git remote add origin git@personal:username/repository.git
Trong lệnh này, “personal” sẽ thay thế tên máy chủ, github.com, trong URL. Lý do điều này là cần thiết vì cấu hình của SSH mặc định chọn khóa dựa trên tên hostname, trong cả khối personal và khối work chỉ là github.com. Bạn phải chỉ định thủ công để Git có thể chọn đúng.