量産メモ帳

忘れっぽいのでメモを残しています。浅く適当に書きます。

GitHub アカウントに SSH 公開鍵を登録する。

スポンサーリンク

Windows 8SSH 公開鍵を作成しようとすると、何らかの SSH クライアントが必要になる。
SSH クライアントの候補はザッとこんな感じ:



今回は過去にインストール済みの Cygwin を選んだ。

  • Cygwin はデフォルトで ssh 関連のコマンドがインストールされないので、インストール時に Net カテゴリにある openssh を選択しておく必要がある。
  • 最後に述べるが、SSH クライアントは Cygwin よりも MSysGit の方が良いかもしれない。



まず、以下のような手順で SSH 鍵を作成した。

  1. CygwinBash (C:\cygwin\bin\bash.exe) を起動する。
    • ちなみに MSysGit の Bash は C:\msysgit\msysgit\bin\bash.exe
  2. BashSSH 鍵作成コマンドを実行する。
    • ssh-keygen -t rsa -C "任意の文字列"
      • -C オプションを付けたのは、付けないと、SSH 公開鍵に自分の Windows ユーザー名とマシン名が含まれてしまうため。
      • -t rsa オプションは付けても付けなくても良い。付けなくてもデフォルトで RSA 暗号の SSH 鍵が作成される。
  3. Bash】"Enter file in which to save the key (中略):"というメッセージが表示されたら、SSH 秘密鍵ファイルのパスを入力する。
    • 入力しない場合、括弧内に表示されたパスで SSH 秘密鍵ファイルが作成される。
    • 既に同じパスのファイルが存在する場合、"Overwrite (y/n)?"というメッセージが表示される。
  4. Bash】"Enter passphrase (empty for no passphrase):"が表示されたら、SSH 鍵用のパスフレーズを入力する。
    • 入力しない場合、パスワードなしの SSH 鍵ができる。
  5. Bash】"Enter same passphrase again:"が表示されたら、同じパスフレーズを入力する。
  6. Bash】最後に以下のようなメッセージが表示されれば、SSH 鍵作成はひとまず完了。

Your identification has been saved (後略)
Your public key has been saved in (後略)
The key fingerprint is: (後略)



次に、以下のような手順で GitHub アカウントに SSH 公開鍵を登録した。

  1. 以下のページにアクセスして、「Add SSH Key」ボタンを押す。
  2. 「Title」テキストボックスに任意の文字列を入力する。
  3. 「Key」テキストボックスには以下の手順で文字列を貼り付ける。
    1. 先ほど作成されたファイルの内、pub 拡張子が付いているファイルが SSH 公開鍵ファイルなので、これを notepad などのテキストエディタで開く。
    2. ファイル内の文字列をコピーして、「Key」テキストボックスに貼り付ける。
  4. 「Add Key」ボタンを押す。



最後に、GitHubSSH ログインを試みて、動作検証を行なったが、ここで問題が起きた。
以下のいずれかのコマンドで SSH ログインできるが、、

実行すると、以下のようなメッセージが表示された。


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0660 for '(中略)' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: (中略)
Permission denied (publickey).

要は、SSH 秘密鍵ファイルのアクセス権限が広過ぎるので狭くしなさい、と言っている。
Bash でファイルがあるディレクトリに移動して、"ls -l"コマンドで確認すると、こんな感じになっていた。


-rwxrwx---+ 1 (Windows ユーザー名) なし 1675 7月20 00:00 id_rsa
-rwxrwx---+ 1 (Windows ユーザー名) なし 391 7月20 00:00 id_rsa.pub

確かに SSH 秘密鍵ファイル(id_rsa)へのアクセス権限は 0770 と広めになっているが、もう一つ問題があって、それはグループ名が「なし」になっていることだった。
この状態で、"chmod 0600 id_rsa"コマンドを実行すると、以下のようになってしまう。


-rw-rw----+ 1 (Windows ユーザー名) なし 1675 7月20 00:00 id_rsa
-rwxrwx---+ 1 (Windows ユーザー名) なし 391 7月20 00:00 id_rsa.pub

つまり、アクセス権限を"0600"にしたつもりが、"0660"になってしまう。
"ls -v 0600 id_rsa"という様に -v オプションを付けて実行すると分かるが、Cygwin は変更したつもりでいる。。


この問題を解決するためには、以下のいずれかの様にファイルに何らかの所有グループ名を指定するコマンドを実行しなければならない。

  • chgrp Users id_rsa
  • chgrp -v Users id_rsa



ちなみに、グループ名は Windows マシンに存在するものでなければならないが、グループ一覧は以下の手順で確認できる。

  1. [Windows ロゴマーク]+[R]ボタンを押す。⇒【ファイル名を指定して実行】ダイアログが表示される。
  2. 【ファイル名を指定して実行】"lusrmgr.msc"を入力する。⇒【ローカルユーザーとグループ】ダイアログが表示される。
  3. 【ローカルユーザーとグループ】「グループ」をクリックまたはダブルクリックする。



ファイルの所有グループ名を Users にした後、再び"chmod 0600 id_rsa"コマンドを実行すると、以下のようになった。


-rw-------+ 1 (Windows ユーザー名) Users 1675 7月20 00:00 id_rsa
-rwxrwx---+ 1 (Windows ユーザー名) なし 391 7月20 00:00 id_rsa.pub

この状態で"ssh git@github.com"コマンドを実行すると、今度は以下のように正常終了した。


Enter passphrase for key '(中略)':
Hi (中略)! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.



最後に余談。
上述は Cygwin での例だが、MSysGit で"ls -l"コマンドを実行すると、以下のようになった。


-rw-r--r-- 1 (Windows ユーザー名) Administ 1675 7月20 00:00 id_rsa
-rw-r--r-- 1 (Windows ユーザー名) Administ 391 7月20 00:00 id_rsa.pub

アクセス権限と所有グループ名が Cygwin で設定したものと異なっている。。
どちらかと言えば、MSysGit の方が状態を正しく表しているようにも見える。。
この状態で試しに MSysGit で"ssh git@github.com"コマンドを実行すると、アクセス権限の問題は発生せずに正常終了する。。
最初から MSysGit を使えば、ここまで苦労しなかったかも。。


参考資料:

関連記事: