下のようにsshでgitをクローンしようとしたら
git clone git@github.com:....git
Cloning into '...'...
Enter passphrase for key
とパスワードを毎回求められてしまって困っていました。
あれ設定してたのにおかしいなと思いつつ、sshもしかしてあまりわかってない?と思ったので、sshについてちゃんと調べてみようと思います。
sshとは
Secure Shell
の略称で、物理的に遠い場所にあるリモートコンピュータに接続するための通信プロトコルです。
コンピュータを遠隔で操作するにあたって遠隔操作するための通信を暗号化することによって、外部からの攻撃を防ぎながら通信することができます。
認証方式
SSHには、パスワード認証方式と公開鍵暗号方式の2つあります。
パスワード認証方式
パスワード認証方式は、webサイトのログインでよくあるIDとパスワードを入力して認証する方式のことです。
クライアントがユーザ情報(ID)とパスワードを送信して、サーバー(接続先のコンピュータ等)がそのユーザ情報とパスワードの組み合わせに合致するデータがあるかを調べ、合致したら認証するという仕組みです。
この認証方式は手軽ではありますが、問題としてパスワードが流出すると不正アクセスできてしまうことやユーザーとパスワードの組み合わせを総当たりで入力する攻撃(ブルートフォールス攻撃)によって、認証が突破されやすいというデメリットがあります。
公開鍵暗号方式
公開鍵暗号方式は、紐づけられた公開鍵秘密鍵を生成して認証する仕組みです。
公開鍵と秘密鍵はクライアントが作成します。
秘密鍵はクライアントに、公開鍵をサーバーに渡して、認証していきます。
まず、クライアントがサーバーにリクエストします。
そしてサーバーはレスポンスとして公開鍵で生成した乱数から暗号化した電子署名を送ります。
それをクライアントは秘密鍵で復元します。
復元して解読した署名をサーバーが受け取ると認証するという仕組みです。
鍵を生成する
ssh-keygenコマンドを使って公開鍵、秘密鍵を生成します
-tオプションで暗号方式を決定し、-Cでコメントにメールアドレスを記述します。
ssh-keygen -t ed25519 -C <mail_address>
パスフレーズを求められると下のような表示が出てきます。
これはrandomart image
という人間が視覚的に生成された鍵が違うものだと認識できるように作られたフィンガープリントのことです。
+--[ED25519 256]--+
| . o=o. o++ |
| .o+o+ . . ..o==.|
| o.B . . . .o.Oo|
| X * = o E.=|
| + X * S . o .|
| o + + |
| . o |
| |
| |
+----[SHA256]-----+
生成ができたら、.ssh/config
に下のような記述をします。
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
秘密鍵をssh-addで登録します。
--apple-use-keychainでmacのキーチェーンに保存しています。
こうすることでsshの際にパスフレーズを聞かれなくなります。
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
これで公開鍵をコピーします。
pbcopy < ~/.ssh/id_ed25519.pub
ここでsshを登録します。
下のTitleの任意の名前にします。
Keyに先ほどコピーした公開鍵を貼り付けます。
Add SSH key
を押した後に下のコマンドで接続できるかを確認します。
ssh -T git@github.com
下のように出てきたら完了です!
Hi <user_name>! You've successfully authenticated, but GitHub does not provide shell access.
git関連の記事