第10章 GitをSSHで使う方法
チュートリアルの最後にGitをSSHでリモートと繋ぐ方法を説明します。 これはJekyllからは離れた内容ですが、GitはJekyll、GitHubと切り離せない内容ですので取り上げました。 Appendix的な内容になります。
今までこのチュートリアルではgitとGitHubをHTTPSプロトコルで繋げてきました。 HTTPSの他にSSHプロトコルを使う方法もあります。 今回はそれを取り上げます。
この記事を読む前に注意していただきたいこと
会社のコンピュータなどの場合、インターネットと社内ネットワークの間にプロキシサーバーが置かれている場合が多いです。 プロキシサーバーの中にはSSHの通信を禁止している場合があります。 具体的には、SSHサーバーはポート番号22を使うので、プロキシがポート22への通信を破棄すればSSH通信を禁止できます。 この場合はポート22でGitHubへのSSH接続はできませんが、ポート443でもGitHubにSSH接続できます。
このことを使ってGitHubにSSH接続する情報を見つけました。
ただし、私の方では動作確認は取れていません。
とにかく、プロキシがある場合は面倒なことになります。 以下では、プロキシがない場合(個人でプロバイダーを通してインターネットに接続する場合など)を説明します。
SSHについて
SSHは、2台のコンピュータがネットワークを通してデータを暗号化して通信するためのプロトコルです。 主にサーバにリモート・ログインして使うのに用いられますが、GitHubとGitの通信でも使えます。
情報の暗号化には「公開鍵」と「秘密鍵」を使います。 公開鍵と秘密鍵についてはウィキペディアに説明があります。
簡単に説明すると、
- 秘密鍵は自分の手元に置いておく
- 公開鍵は誰でも取得することができる
- 公開鍵でデータを暗号化したものは秘密鍵で元のデータに復元できる
- 秘密鍵でデータを暗号化したものは公開鍵で元のデータに復元できる
- 公開鍵で暗号化したデータを公開鍵で元に戻すことはできない。秘密鍵も同様。
AがBに暗号化したデータを送るとき、万一B以外がその暗号データを手に入れても、復号できないために
Aが(Bの作成した)公開鍵で暗号化したデータをBに送る。Bはそれを(Bの作成した)秘密鍵で元のデータに戻す。
という方法が取られます。 秘密鍵と公開鍵の使い方を逆にすると誰でも解読できてしまうので注意が必要です。 (そういう使い方は別の意味で有効なことがありますが)
このことから、GitHubを使っているユーザをAさんとすると
- AさんがGitHubからデータをダウンロードするときには、GitHubがAさんの公開鍵で暗号化しAさんは(Aさんの)秘密鍵で復元する
- AさんがGitHubにデータをアップロードするときには、AさんがGitHubの公開鍵で暗号化してGitHubは(GitHubの)秘密鍵で復元する
ということになります。 したがって、データのやり取り以前に公開鍵を相手に伝えておくことが必要になります。
GitHubのドキュメントに、SSHを使ったGitとGitHubの通信の設定方法が書かれています。 これを読みながら設定することをお勧めします。
鍵の生成
鍵の生成にはssh-keygen
というコマンドを使います。
$ ssh-keygen -t ed25519 -C "ユーザのemailアドレス"
ed25519は暗号化の方式です。 ウィキペディアのエドワーズ曲線デジタル署名アルゴリズムに説明があります。
Enter a file in which to save the key
というプロンプトに対しては単にエンターキーを押せば良いです。
Enter passphrase (empty for no passphrase)
というプロンプトに対してはパスフレーズを入力します。 パスフレーズはパスワードのようなものです。 自分自身の秘密鍵にアクセスする時にパスフレーズの入力が求められます。 パスフレーズはかならず控えておいてください。
これで、~/.ssh/
に公開鍵「id_ed25519.pub」と秘密鍵「id_ed25519」が生成されます。
ssh-agentをバックグラウンドで走らせ、秘密鍵を登録します
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_ed25519
ここで行った手続きの詳細についてはOpenSSHのウェブサイトを参照してください。
GituHubへの公開鍵登録
作成した公開鍵をGitHubに登録します。 GItuHubのドキュメントも参考にしてください。
- GItHubをブラウザで開きサインインする
- 右上のアイコン(プロフィールアイコン)をクリックしポップアップメニューから「Settings」をクリックする
- 左側の列のメニューから「SSH and GPG Keys」をクリックする
- 右側の一番上SSH Keysの「New SSH Key」ボタン(緑のボタン)をクリック
- タイトルフィールドには、キーのタイトル、例えば「〇〇のデスクトップマシン」のようなメモを入力する
- ローカルのコンピュータの公開鍵「id_ed25519.pub」をエディタで開き、キーをクリップボードにコピーする。 (重要な注意)秘密鍵と間違わないでください
- ブラウザ画面のKeyのところにペーストする
- 「Add SSH Key」ボタンをクリックする
Gitのリモート・アドレスの変更
GitHubからクローンしたときにHTTPSを選んでクローンしていた場合は、アドレスをSSH用に変更しなければなりません。 今後クローン時には「HTTPS」でなく「SSH」を選んでください。 以下に例を示します。
$ git remote -v
origin https://github.com/ToshioCP/jekyll-tutorial-for-beginners.git (fetch)
origin https://github.com/ToshioCP/jekyll-tutorial-for-beginners.git (push)
$ git remote set-url origin git@github.com:ToshioCP/jekyll-tutorial-for-beginners.git
$ git remote -v
origin git@github.com:ToshioCP/jekyll-tutorial-for-beginners.git (fetch)
origin git@github.com:ToshioCP/jekyll-tutorial-for-beginners.git (push)
「git remote -v」はリモートの一覧を表示します。 上の例では「origin」つまりGitHubが唯一のリモートです。 「git remote set-url (リモート名)(アドレス)」はリモートアドレスを変更します。 「git@」で始まるアドレスはSSH通信でのGitHubのレポジトリアドレスです。
ここまでで、SSH通信の準備ができました。
GitからSSHでGitHubにアクセスする
最初にGitHubからデータを受け取るときに、GitHubの公開鍵を持っていないとデータの復号ができません。 では、公開鍵はいつどうやって手に入れるのでしょうか。 公開鍵は最初にGitHubからデータを入手するときに送信されてきます。 その公開鍵が正しいものかどうかはこの時点ではわかりません。 メッセージが現れ、その公開鍵のフィンガープリント(fingerprintは指紋という意味)が表示されます。 フィンガープリントはGitHubで公開されています。
このフィンガープリントとパソコンに表示されたフィンガープリントが一致するかどうか確認します。 一致していれば正しいGItHubの公開鍵が送られてきたことになります。 「yes」を入力すると公開鍵がローカルに取り込まれます。
これから先は以前と同様、「git clone」「git pull」「git push」などでアクセスできます。 データの暗号化、復号はGitがやるので、ユーザは何もする必要はありません。
公開鍵は通信の開始時に交換され相手を認証します。 公開鍵はすでに互いが持っているので、それと送られてきた公開鍵を比較することによって相手を確認するわけです。 ですから、仮にGitHubが公開鍵を変更すると、送られてきた公開鍵はローカルに持っている公開鍵と違いますから、先程のフィンガープリントが表示され、確認を求められることになります。
なお「git push」するときに、秘密鍵へのアクセスのために、パスフレーズの入力を求められます。 秘密鍵作成時に設定したパスフレーズを入力してください。 一度入力するとそのセッションが続いている間は再入力の必要はありません。
以上、HTTPSからSSHに変更する流れを見てきました。 SSHを使えばいちいちユーザ名やパスワードを求められることがないのでプッシュが楽になります。