[GitHub] SSHの鍵を登録しパスワード入力を不要にする

GitHubを利用している際に、HTTPSリポジトリをcloneしているとpushやpullをする際に毎回IDとパスワードの入力を求められます。一時的にメモリ上などにキャッシュすることも出来るのですが、一定期間が経過すると再び入力する必要があるため根本的な解決になりません。

$ git push
Username for 'https://github.com': katsube      
Password for 'https://katsube@github.com': 

そこで今回はGitHubSSHで利用する公開鍵を登録し、アカウント情報を毎回入力せずに済む設定を行います。

秘密鍵と公開鍵を作成する

まずはローカルで秘密鍵と公開鍵を作成します。 これは至って簡単でssh-keygenコマンドを実行するだけです。-tは暗号化方式、-bはビット長です。デフォルトは2048bitですが長めに設定した方が安全です。-Cはコメントなので任意の文字列を指定します(未指定も可)。鍵は端末やユーザー毎に作成することが多いのでどこで作成した鍵か分かる物にして置くと便利です。

$ ssh-keygen -t rsa -b 4096 -C 'katsube@CentOS'

ssh-keygenコマンドを実行するとァイルの場所、鍵にパスワードをかけるか質問されますのでそれぞれ答えます。パスワードは今回はかけません。エンターキーを押すと指定したパスにファイルが作成されます。

Enter file in which to save the key (/home/neec/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

デフォルトだとホームディレクトリの.sshディレクトリ内に生成されますので、lsコマンドなどで確認します。id_rsa秘密鍵id_rsa.pubが公開鍵です。GitHubには公開鍵の方を登録します。秘密鍵は他の人に見せないよう気をつけてください。ネットワークを介して送信することも避けたほうが安全です。また.sshディレクトリ自身と、秘密鍵のパーミションはオーナーだけが読み書きできるようになっていることも重要です。

$ ls -la .ssh/
drwx------   2 neec neec   57  72 18:50 .
drwx------. 23 neec neec 4096  72 18:33 ..
-rw-------   1 neec neec 3243  72 18:50 id_rsa
-rw-r--r--   1 neec neec  740  72 18:50 id_rsa.pub
-rw-r--r--   1 neec neec  405  68 00:07 known_hosts

公開鍵を表示し、クリップボードにコピーしておきます。

$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC(中略)vAgP05Qw== katsube@CentOS

公開鍵をGitHubへ登録する

GitHubにログインし、右上のメニューなどから「Settings」をクリック。

左側のメニューから「SSH and GPG keys」をクリック。

右上にある「New SSH Key」をクリック。

Titleは適当な文字列を入力、Keyに先ほど生成した公開鍵を入力(ペースト)。下にある「Add SSH key」をクリック。改行やスペースなどの余計な文字が入っていたり、公開鍵の冒頭のssh-rsaやコメント部分を省略すると登録できなかったり認証時に失敗します。

先ほどの画面に戻ってきますので、自分が登録したキーが表示されていれば完了です。

確認する

GitHubからclone

GitHubから自分がオーナーのリポジトリをcloneしてきます。このとき必ずHTTPSではなくSSHを利用してください。

新規にリポジトリを作成した場合は、画面の上部でSSHとHTTPが切り替えられます。

今回は新規にリポジトリを作成したのでこれをgit cloneで取ってきます。

$ git clone git@github.com:katsube/hello1.git
Cloning into 'hello1'...
Warning: Permanently added the RSA host key for IP address '52.192.72.89' to the list of known hosts.
warning: You appear to have cloned an empty repository.

git add/commit

cloneした際に作成されたディレクトリへ移動し、適当なファイルを作ってcommitします。

$ cd hello1/
$ echo "SSH key test" > test.txt
$ git add test.txt 
$ git commit -m '1st commit'
[master (root-commit) 315eb17] 1st commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

git push

先ほどのcommitした情報をgit pushGitHubへ送信します。

$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 226 bytes | 226.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:katsube/hello1.git
 * [new branch]      master -> master

はい、IDやパスワードの入力を求められませんでしたね。