Tạo ssh key và sử dụng ssh key trong git

SSH?

SSH(Secure Shell) là một giao thức mạng dùng để thiết lập kết nối mạng một cách bảo mật.
Khi làm việc với git, ssh sẽ giúp ta trong 2 việc:
1. Bảo mật các kết nối của mình với server.
2. Không phải nhập mật khẩu mỗi lần push code.

Cơ chế làm việc

Bạn sẽ có 2 key: public key và private key. Bạn sẽ gửi public key của mình cho git server của bạn (bitbucket hay github chẳng hạn). Xong, ssh-agent sẽ làm tất cả những việc còn lại cho bạn. Mỗi lần bạn push, ssh-agent sẽ tự gửi kèm các thông tin chứng thực đi, github sẽ nhận diện ra bạn, và bạn không cần phải nhập mật khẩu nữa.
Mình giải thích một cách đơn giản nhất có thể, còn nếu bạn muốn tìm hiểu sâu hơn về cơ chế bên trong, vui lòng đọc trang wiki mà mình đưa ở đầu bài

Sinh SSH key

Bước 1: Kiểm tra xem máy bạn có ssh key nào chưa

Mở cửa sổ dòng lệnh (terminal) và chạy lệnh:

Lệnh trên sẽ kiểm tra trong thư mục .ssh (nằm ở thư mục gốc của user bạn đang đăng nhập vào máy, vd trên Mac: /Users/binhcq/.ssh) có ssh key nào chưa, mặc định, các ssh key thường sẽ có dạng:

public key sẽ có đuôi .pub (id_rsa.pub), private key thì không có đuôi (id_rsa)
Nếu có một cặp ssh key nào trong thư mục này (giả sử là id_rsa và id_rsa.pub), bạn có thể bỏ qua Bước 2 và chuyển thẳng sang Bước 3.

Bước 2: Sinh một SSH key mới

  • Chạy lệnh sau trên terminal
  • Để tránh phiền phức sau này, mình khuyên bạn nên để các cài đặt ở mặc định, như lần này, ssh-agent hỏi bạn muốn lưu key của mình ở đâu thì bạn cứ thế mà Enter thôi:
  • Tiếp đến thì nhập mật khẩu cho key của bạn

Lưu ý mật khẩu khi bạn gõ vào nó sẽ không hiển thị mấy dấu ******* như bình thường, nhưng bạn cứ gõ xong rồi Enter thôi. Thêm nữa, bạn nên chọn một mật khẩu ĐỦ MẠNH cho mình, bạn có thể xem thêm lý do tại đây
* Sau khi nhập mật khẩu, bạn sẽ nhận được thông báo về việc mật khẩu đã lưu vào địa chỉ lúc nãy bạn chỉ định:

Bước 3: Thêm key của bạn vào ssh-agent

ssh-agent là trình quản lý ssh key của bạn, công việc của nó thì nãy mình có nói qua ở trên rồi đó.
* Đảm bảo rằng ssh-agent đã được kích hoạt bằng lệnh:

  • Add ssh key của bạn vào ssh-agent

Lưu ýid_rsa chính là private key của bạn, nếu ở bước 2, bạn có key khác thì thay tên key tương ứng vào.

 

Step Extra. Cấu hình SSH config file

1. Mở (hoặc tạo mới) file sudo nano ~/.ssh/config 
2. Thêm toàn bộ nội dung file như sau đây vào file config:

1
2
Host bitbucket.org
 IdentityFile ~/.ssh/id_rsa

Dòng thứ 2 thụt vào 1 khoảng trắng. Là đường dẫn chỉ đến file private key mà ta đã tạo ở trên.

3. Lưu và đóng file lại
4. Khởi động lại GitBash hoặc Terminal

 

Bước 4: Thêm ssh public key vào tài khoản trên server của bạn (github, bitbucket…)

Copy ssh key vào clipboard:

Sau đó lên tài khoản của bạn, vào mục setting, tìm tới mục Add ssh key và dán nội dung đã copy lúc nãy vào:
Screen Shot 2015-08-06 at 10.52.07 PM

Bước 5: Kiếm tra lại xem mọi thứ đã OK chưa:

Với github thì là ssh -T git@github.com
Có thể bạn sẽ nhận được thông báo về việc thêm host bitbucket vào danh sách tin cậy:

Bạn chỉ việc gõ yes vào terminal rồi Enter là được.
Và bạn sẽ nhận được dòng thông báo thành công:

Hoặc github:

OK, đến đây là bạn đã có thể sử dụng link ssh rồi. (nếu chưa được đọc tiếp !)

Extra :

6. Quay lại GitBash, kiểm tra máy tính đã kết nối đến bitbucket server thành công chưa.

1
ssh -T git@bitbucket.org

Và một dòng thông báo thành công tương tự như sau với khóa ta vừa tạo:

1
2
logged in as vunb.
You can use git or hg to connect to Bitbucket. Shell access is disabled.

7. Vấn đề bị từ chối truy cập

Trong trường hợp nhận được dòng thông báo Permission denied (publickey). có nghĩa rằng việc cài đặt của chúng ta chưa thành công hoặc cặp khóa mã chưa được nạp trong GitBash. Sử dụng lệnh sau kiểm tra private key đã được nạp hay chưa:

1
2
$ssh-add -l
2048 2e:ec:72:cc:e7:bf:93:eb:35:80:16:d5:aa:9b:1e:2f /c/Users/Vunb/.ssh/id_rsa (RSA)

Nếu dính lỗi này hãy thực hiện thêm bước Step 6, không thì chúng ta đã hoàn tất việc và thử một vài lệnh git/add/commit/push/pull để thao tác với kho mã nguồn trên Bitbucket.

Step 6. Nạp ssh key tự động

Chúng ta cần làm 1 việc cho thuận tiện khi làm việc với Git là nạp ssh key tự động mỗi khi chạy GitBash. Để làm vệc này ta tạo một file với tên ~/.bashrc với nội dung như sau:

1. Tạo file với nội dung sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SSH_ENV=$HOME/.ssh/environment
   
# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    /usr/bin/ssh-agent sed 's/^echo/#echo/' "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    "${SSH_ENV}" /dev/null
    /usr/bin/ssh-add
}
   
if [ -f "${SSH_ENV}" ]; then
     "${SSH_ENV}" /dev/null
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

2. Lưu và đóng file lại
3. Khởi động lại GitBash

Chương trình sẽ nhắc bạn nhập mật khẩu passphrase như sau:

1
2
3
4
Welcome to Git (version 1.9.4.msysgit.2)
Run 'git help git' to display the help index.
Run 'git help <command>' to display help for specific commands.
Enter passphrase for /c/Users/Vunb/.ssh/id_rsa:

4. Nhập mật khẩu của bạn vào
5. Thực hiện lệnh lại lệnh kiểm tra private key đã nạp thành công

1
2
$ssh-add -l
2048 2e:ec:72:cc:e7:bf:93:eb:35:80:16:d5:aa:9b:1e:2f /c/Users/Vunb/.ssh/id_rsa (RSA)

Chú ý 1: Trường hợp mục không nạp ssh-key tự động được, hãy thay đổi lại nội dung file .bashrc như sau và làm lại bước 6.2, 6.3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
agent_running() {
    "$SSH_AUTH_SOCK" ] && { ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]; }
}
env=~/.ssh/agent.env
if ! agent_running && [ -s "$env" ]; then
    "$env" >/dev/null
fi
if ! agent_running; then
    ssh-agent >"$env"
    "$env" >/dev/null
    ssh-add
fi
unset env

Chú ý 2: Nếu đã áp dụng đầy đủ các bước trên vẫn không được, hãy copy file .bashrc thành file với tên .profile cùng cấp thư mục ~

Vậy là hoàn tất. Chúc các bạn thành công !

Liên kết tham khảo

Thêm chút nữa:

Vậy nếu cùng lúc tôi muốn dùng ssh với hai tài khoản của cùng một server (github chẳng hạn) có được không?
Được, nhưng bạn phải sinh 2 ssh key, để biết thêm chi tiết, vui lòng đọc bài viết Sử dụng ssh với 2 tài khoản github cùng 1 lúc của mình.
Còn nếu tôi muốn cùng lúc đưa code của mình lên hai server khác nhau?
Hoàn toàn được, bạn vui lòng đọc bài viết Git remote và việc push source code lên nhiều nơi cùng lúc của mình.
Vậy là với ssh, từ nay bạn sẽ giảm được một phần thao tác rườm ra khi làm việc với git, và tập trung vào chuyên môn của mình hơn 😛

Lập trình và hơn thế nữa

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s