Githubへpushなどをするときに毎回パスワードなどを聞かれるため、sshで自動で認証してくれるように公開鍵/秘密鍵の設定をします。
ちなみに毎回パスワードをきかれるのはgithubにhttps通信で接続していたためでした。
また、下記のようなPermission
(権限)系のエラーが出たときにもこの方法で解決することが多いので試してみてください。
Permission denied (publickey).
Githubを使い始めた人や、久しぶりに使った人、今まで使用していたPCを変えた場合にも起こりやすいエラーです。
Githubに登録したメールアドレスが必要になるので予めメモしておいてください。
秘密鍵と公開鍵を作成する
まずはssh通信に必要な秘密鍵と公開鍵の作成を行います。
基本的に秘密鍵と公開鍵はペアで生成されます。
秘密鍵は自分のPC内で保持し、公開鍵を外部(今回はGithub)に登録することでコマンドを打ったときに顔パスのような状態にすることができます。
下記のコマンドを実行すると~/.ssh/
配下にgithubというファイル名で秘密鍵を作成します。
と同時に同階層にgithub.pub
というファイル名の公開鍵も生成されます。
$ ssh-keygen -t ed25519 -N "" -f ~/.ssh/github -C Githubに登録したメールアドレス
メールアドレスはGithubにログインできるのであれば、右上アイコンのsettings > Emails
から確認することができます。
公開鍵の内容をコピーしてGithubに登録する
作成された公開鍵をGithubに登録します。
秘密鍵は名前の通り誰にも知られてはいけないものなので間違えてコピーしないようにしてください。
下記のコマンドを実行すると、ファイルを開かずに~/.ssh/github.pub
の内容をそのままクリップボードにコピーしてくれます(Macの場合)。
$ pbcopy < ~/.ssh/github.pub
コマンドを実行したらブラウザからGithubにログインして下記のページまでいきましょう。
settings > SSH and GPG keys > New SSH key
titleにはPCを識別できるような内容を入れておきます。
何でもいいのですが、今から登録する内容は今のPCからGithubにパスワードなしでアクセスできるようにするもので、PCや端末が変わる度に新しく登録する必要がありますので、それを加味した上で名前をつけるのが良いでしょう。
keyにはさきほどクリップボードにコピーした公開鍵の内容を貼り付けます。
入力ができたら『Add SSH key』を押して保存しましょう。
秘密鍵の参照先を設定する
今回は自分でファイル名を指定して公開鍵と秘密鍵を作成したので、このままではssh接続した際にGithubに登録した公開鍵のペアである秘密鍵のファイルを見つけられず再びエラーになってしまいます。
鍵を作るときに名前を指定していれば、うまくいかないかもしれません。
GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~
それは、ssh接続の際「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」しかデフォルトでは見にいかないからです。
実際にここで接続テストを行うとエラーを返されます。
$ ssh -T github.com
Warning: Permanently added the RSA host key for IP address 'xx.xx.xxx.xx' to the list of known hosts.
user@github.com: Permission denied (publickey).
てことで下記のように新しくconfigから秘密鍵の参照先の設定を行いましょう。
$ vim ~/.ssh/config
vimエディタが開けたら下記をそのままコピーして貼り付けます。
すでにconfigファイルがある人は最後尾に貼り付けます。
重要なのは3行目に秘密鍵のパスが書かれていることです。
Host github.com
HostName github.com
IdentityFile ~/.ssh/github
User git
LogLevel QUIET
vimファイルを閉じるときは下記のように操作します。
『escキー』 + 『:(コロン)』 + 『w』 + 『q』esc
でコマンド入力モード、:
でコマンド入力開始、w
で編集内容を保存、q
でvimエディタを抜けるという意味になります。
これで接続テストを行えば成功します。
$ ssh -T github.com
Hi shomiyu! You've successfully authenticated, but GitHub does not provide shell access.