みなさん、こんにちは、はむさんです!
これからプログラミングを始めよう!という初学者が通る最初の登竜門として 『GitHubのアカウントを作ってリポジトリをgitコマンドでcloneする!』 というのがあるんですが、そこでsshの鍵というのが必要になる場面があります。今回はこのssh の鍵を作成する手順について、GitHubとの連携の話を踏まえながらお伝えしていきます。
まだGitHubとの連携設定をお済みでない方にとっての参考になる情報になればと思い記事をまとめてみました。
では、こちらのページをご覧ください。 こちらはReactというJavaScriptのライブラリのリポジトリのトップページになります。 これは公開リポジトリといって誰でもこちらのソースコードを手元にダウンロードすることができます。 gitでは手元にファイルをダウンロードすることをcloneすると言います。
で、そのcloneを行うには、git のcloneコマンドを実行するわけですが、そのコマンドの実行には、git のリポジトリのURLが必要になります。
そのURLはどこから分かるのかと言うと、画面の真ん中にある、こちらの緑色のCode
と書かれたボタンをクリックすると表示されます。
こちらは、GitHubのあるリポジトリをcloneする際の、そのgitのCloneの種類を選択するところのUIのパーツを抜粋したものになります。 通常、git のclone を行うには、sshを用いるのが最も標準的なやり方になるんですが、GitHubの場合だとその手段は豊富で、なんと3種類も用意されています。 その種類の多さが逆に仇となっているのか、cloneに失敗した場合、どの方法で上手く行かなかったのかの切り分けにも時間がかかるので、僕は個人的に、この受け皿の多さには批判的ではあります。
まぁここで文句をいってもしょうがないので、僕ならどれが良いかをここで断言しておきます。迷わず、真ん中にある SSHです。
では、なぜかを述べたいと思います。
HTTPS
の方は予め GitHub独自 のトークンの発行をしておかないといけないというのがあります。
また、GitHub CLI
についても同様で GitHub独自 のghという 独自コマンド のインストールが必要となります。このように、この独自の知識を必要とする点がこれから学ぼうという初学者にとっての、プラスアルファな 学習コスト になっているという点で僕は初学者に対しては、あまりオススメはしたくないマイナスポイントになっている要因であると言わざるを得ないです。
じゃあ残ったSSH はどうかというと、GitHubが脚色しているものはなく、どんなgitのサービスでも用いられる標準的な手法となります。これをプロトコルと言いますが、この標準的なプロトコルが用いられているというのが、ベストチョイスである理由になります。 つまり、SSHの基本的な知識を身に付けておけば、GitHub以外のgitのサーバーとの連携でも方法としてブレずに、同じやり方で連携できるので、少しだけ学習コストはあるものの、一度覚えてしまえば、半永久的にこの方法でもってgitとの連携ができるということになりますので、まぁこの3つの中からだと文句無しで SSH を選択しておけば間違いないだろう、というのが僕の見解です。
じゃあ、このSSHを使ってCloneをしようじゃないかということで、コマンドを実行してみると、macの方だとこんなエラーが発生してしまいます。
$ git clone git@github.com:facebook/react.git xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
gitはmacに最初っから入っているツールではあるんですが、どうもXcodeというアプリケーションにある デベロッパツール
をinstallする必要があるということなので、これをinstallしてあげないとだめということですね。
はい、これもサクッといれてしまいましょう!
インストール
ボタンをクリックします。すると、今度は、『使用許諾契約』というのが表示されます。ここも『同意する』をクリックします。
すると、インストールが始まります。
このxcodeのインストールですが、ネットワーク環境とかマシン環境によっては時間のかかる作業になります。 辛抱強く待ちましょう。ちなみに、僕のマシンだと15分くらいかかりました。
こうなったら終了です。完了ボタンをクリックします。
では、もう一度 git clone
をやってみましょう。
$ git clone git@github.com:facebook/react.git Cloning into 'react'... The authenticity of host 'github.com (52.69.186.44)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no/[fingerprint])?
Are you sure you want to continue connecting (yes/no/[fingerprint])?
という質問が来ました。
これは指紋を追加しますか?と聞かれているので、yesで回答します。
$ git clone git@github.com:facebook/react.git Cloning into 'react'... The authenticity of host 'github.com (52.69.186.44)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts. git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
すると、次はこのようなエラーが表示されました。
fatal: Could not read from remote repository.
リモートのリポジトリを読む権限が無いようです。
では、もう少し画面をよく見てみましょう。こちらがSSHを選択したときの画面になりますね。
はい、これですね。よく見てみると、こう書かれています。
You don’t have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS.
SSHの公開鍵がまだ登録されていないようですね。と言われていますね。 なので、公開鍵を登録しましょう。この公開鍵の登録をすることで、git cloneを行った時に、sshというプロトコルを使うんですがこの時に鍵を使って認証されるんですね。 で、認証が通ったら、このgit cloneを行っている人は、登録されているこの公開鍵の持ち主だということがサーバ側で判断できるようになるんですね。 なので、git cloneをさせてもらえるという状態に持っていけるわけです。 ということで、こちらのadd a new public keyのリンク先を覗いてみましょう。
このようなフォーム画面が表示されていると思います。
Title
と Key
をそれぞれ入力することができます。
Title
には、名前のようなものを書いておけば良いです。これから鍵を登録するわけなんですが、この鍵はいくつも登録できるんですよね。
で、どれがどの鍵なんだ?って後で識別できるように、分かりやすい名前を付けておきましょうということですね。
で、次の Key
は公開鍵になります。
ここの注釈に、 ssh-rsa
とか ecdsa-sha2-nistp256
みたいな文字列が先頭にくるようなものでなければならないということがここに書かれています。
これ、どういうことかというと、sshの鍵を作る際は、どのような方式、つまり、アルゴリズムを指定するんですよね、デフォルトのsshの鍵を生成するコマンドでは、 rsa
が採用されますが、他にもここに書かれているように色々あって、この内のどれかにしてくださいね。ということがここから分かります。
じゃあ、早速なんですが、鍵を作っていきましょう。
まずは、ターミナルを起動します。
この鍵 ssh-keygen
コマンドで作ります。
まず、鍵を作るので専用の場所を用意します。まずは、ホームディレクトリ直下に .ssh
という名前でディレクトリを mkdir
コマンドで作成します。
$ mkdir -p ~/.ssh
cd
コマンドで .ssh
ディレクトリに移動します。
$ cd ~/.ssh
ここでは、誰の鍵かを分かるようにしておきたいので、 gipcompany-test
という名前のディレクトリを作ります。
$ mkdir gipcompany-test $ cd gipcompany-test
では、ここで鍵を作ろうと思いますが、先程少しふれた 鍵を作る際に指定するアルゴリズムについてですが、公式のGitHubのページではここの鍵を作る際にどのアルゴリズムを採用しているのかが少し気になったのでちょっと見てみたら
$ ssh-keygen -t ed25519 -C "your_email@example.com"
というコマンド例が載っていたんですよね。
ed25519
が例として使われていました。
僕は、 ed25519
は使わないんですが、GitHubがこの ed25519 を例としてあげているので、ちょっと市場調査と言うか、ツイッターでアンケートを取ってみました。
ed25519とrsaどちらを使って鍵を作りますか?
そしたら、まぁ、このような結果でした。
rsa
が91%ということで圧倒的に rsa
の方が使われている。ということで、GitHubというバイアスなしで聞いてみたところrsaがポピュラーだったと言う結果が得られました。
また、ssh-keygen のコマンドのデフォルトで採用されるアルゴリズムもrsaなんですよね。なので、今後もこのrsaを信頼して良いんじゃないかなって思います。
ということで今回もこのrsaを使って鍵を作っていこうと思います。
実行するコマンドはこちらです。
$ ssh-keygen -t rsa -b 4096 -C "gipcompany-test@gmail.com" -f ~/.ssh/gipcompany-test/id_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase):
すると、 passphrase
を入力してくださいと言われました。このパスフレーズってやつもちゃんと設定します。
Enter passphrase (empty for no passphrase): Enter same passphrase again:
間違えてはいけないので、確認のためにもう一度入力します。 成功すると以下のような表示になるはずです。
$ ssh-keygen -t rsa -b 4096 -C "gipcompany-test@gmail.com" -f ~/.ssh/gipcompany-test/id_rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/ham/.ssh/gipcompany-test/id_rsa. Your public key has been saved in /Users/ham/.ssh/gipcompany-test/id_rsa.pub. The key fingerprint is: SHA256:dEoWyuLkcSofwWbTNE7fbxDPlA8nEpbTaI1D13H2TiY gipcompany-test@gmail.com The key's randomart image is: +---[RSA 4096]----+ | + ..=Boo..o| | . * + +O** oo.| | X * =.++o=E +| | * B + o o .= | | . = S o .| | o . . | | . | | | | | +----[SHA256]-----+
ちなみに、鍵を作る際にコマンドに渡したオプションの意味を説明しておきます。
-t
は鍵の種類のことです。種類は英語でtypeなので-t
で指定しました。
rsaはコマンドのデフォルトで指定されるタイプであることと、最も良く使われているtypeで、信頼性も高いので、僕はいつもこれを利用するようにしています。
デフォルトなのでわざわざこの-t
オプションを付ける必要はないんじゃない?って思うかもしれませんが
このデフォルトが今後もrsaであり続ける保証はないので付けておくようにしています。
-b
は長さです。鍵というのは長ければ長いほど強度が強くなります。その長さをbで指定します。bは何かというとbyteのことです。
-C
はコメントです。
-f
はman ssh-keygen
で確認すると、 output_keyfile のこと、つまりファイルの出力先、つまり鍵の出力先ということが分かります。
-f filename Specifies the filename of the key file.
では、生成されたファイルを確認してみましょう。
$ ls id_rsa id_rsa.pub
-f
で指定した名前で鍵が作られています。 id_rsa が秘密鍵、 id_rsa.pub が公開鍵になります。
pubというのは、publicつまり「公開された」という意味になるんですが、そこからどちらが公開鍵なのかが識別できるということになります。
で、いまからこの公開鍵をGitHubへ登録していきます。この公開鍵は文字通り、鍵がリークしても全く問題はありません。
しかし、こちらのid_rsaの方、こちらは、絶対にリークされてはいけないものです。文字通り今目の前にありますけど、ここ以外に実体が存在しないということが、絶対条件になります。
コピーとかも一切禁止です。絶対に複製はしないでください。
そして、絶対に内容を誰にも漏らさないでください。
では、GitHubへ公開鍵の登録を行っていきます。クリップボードに公開鍵の内容をコピーしましょう。
$ cat id_rsa.pub|pbcopy
そしたら、先程の画面に戻って以下のようにTitleに鍵を作った時にコメントに渡した文字列を記入します。
で、Keyには公開鍵の内容をペーストします。クリップボードへのコピーには pbcopy
コマンドが便利ですが、別にこれでなくても良いです。
ここまでできたらAdd SSH Key
ボタンをクリックします。
では、鍵が準備できたというところでgit clone
の再チャレンジです。
$ git clone git@github.com:facebook/react.git Cloning into 'public-repository'... git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
ん?だめだと言われました。
これは、gitコマンドがsshプロトコルで通信をする上で、先程生成した鍵を適切に使えていないためなんですね。
鍵の場所は、自分しか知らないんですよね、 /Users/ham/.ssh/gipcompany-test
という場所にあることは、gitコマンドはしらないんですね。
そのことをsshの設定に書いてあげないといけないんですよね。
なのでそれをやっていきます。
まず、ディレクトリを移動します。
$ cd ~/.ssh
設定ファイルを作成します。
$ touch config
これでファイルができました。
diff --git a/config b/config index e69de29..83cd7a8 100644 --- a/config +++ b/config @@ -0,0 +1,3 @@ +Host github.com + User git + IdentityFile ~/.ssh/gipcompany-test/id_rsa
ここで設定した内容の意味は、 github.com と通信する際のユーザ名は git
であること、そしてその際に用いる秘密鍵は ~/.ssh/gipcompany-test/id_rsa
であることをsshの設定として追加しました。
では、リトライです。 git clone
やってみましょう。
では、リトライです。
$ git clone git@github.com:facebook/react.git Cloning into 'react'... Enter passphrase for key '/Users/ham/.ssh/gipcompany-test/id_rsa':
次はどうでしょう? passphrase
の入力が聞かれていますね。成功です。パスフレーズを入力してエンターを押します。
$ git clone git@github.com:facebook/react.git Cloning into 'react'... Enter passphrase for key '/Users/ham/.ssh/gipcompany-test/id_rsa': remote: Enumerating objects: 197986, done. remote: Counting objects: 100% (156/156), done. remote: Compressing objects: 100% (113/113), done. remote: Total 197986 (delta 66), reused 103 (delta 42), pack-reused 197830 Receiving objects: 100% (197986/197986), 168.27 MiB | 2.85 MiB/s, done. Resolving deltas: 100% (140191/140191), done.
ファイルを受信しているようです。終わるのを待ちます。。。
Resolving deltas: 100% (140191/140191), done.
というのが表示されました。正常に終わったようです。
$ cd react $ ls AUTHORS CODE_OF_CONDUCT.md LICENSE ReactVersions.js appveyor.yml dangerfile.js netlify.toml packages yarn.lock CHANGELOG.md CONTRIBUTING.md README.md SECURITY.md babel.config.js fixtures package.json scripts
はい、ではreactのディレクトリに cd
コマンドで移動して、ファイルの一覧を ls
コマンドで確認してみましょう。
はい、ちゃんと見れましたね!
おめでとうございます!これで、GitHubとsshを使って連携ができるようになりました!
Hooray!