こんにちは。 pregum_foxです。 今回は、WindowsのGit BashからGitHubにsshで接続しようとした時に躓いたところをメモします。
目次です。
背景
今までは、 SourceTree というGUIのクライアントツールを使用して居ましたが、CUIで触れる方が良いと思い、コマンドプロンプトからsshで接続を試そうとしました。
前提条件
既にGitHubには今回SSH接続に使用する秘密鍵に対応する公開鍵が登録されていることが前提条件です。
作業環境
項目 | 内容 |
---|---|
sshクライアント | OpenSSH |
OS | Windows10 Home |
ターミナル | Git Bash |
sshクライアントのバージョンは以下の通りです。
$ ssh -V OpenSSH_7.1p2, OpenSSL 1.0.2h 3 May 2016
概要
簡単に説明すると
- SSH接続で使用する秘密鍵のフォーマットがOpen SSHのフォーマットではないというエラーがでる。
- PuTTY Key Generatorを使って作成した秘密鍵をOpen SSHのフォーマットに変換する。
ssh-agent
コマンドを叩くssh-add <秘密鍵のファイルパス>
コマンドを叩き、秘密鍵をsshエージェントに追加する。- ターミナルからGitHubの操作ができる!
原因
原因は上記にも記載した通り、登録しようとした秘密鍵のフォーマットが不正であったことが原因でした。 元々鍵はPUTTYGEN.exeを使用して作成しました。
作成手順は以下の記事に記載していますのでよければご覧ください。
対処方法
上記で使用したPUTTYGEN.exeを用いて秘密鍵のフォーマットをOpenSSH形式に変換すれば、ssh接続ができるようになりました。
図解
具体的な手順を図を用いて説明します。
-
まずSSH接続ができていないことを確認する為に
ssh -T git@github.com
とコマンドを叩きます。
その時、Hi <名前>! You've successfully authenticated, but GitHub does not provide shell access.
と表示されていればSSH接続はできています。お疲れ様でした。
しかし、この記事をご覧になっている人はSSH接続ができていないはずなので、以下の画像の様にPermission denied (publickey).
と表示されていると思います。
されていなければ、違う箇所で問題が起きている可能性が高いのでこの記事はお役に立てないかもしれません。ごめんなさい。 -
まずはssh-agentを起動します。
単純にssh-agent
とコマンドを入力しただけでは、sshエージェントが立ち上がらないので下図のようにeval `ssh-agent`
と入力します。
ssh-agentの両端に`をつけ忘れないように気を付けてください。 -
ssh-add <秘密鍵のパス>
を叩いて秘密鍵を追加します。
私はここでError loading key "<追加しようとしたパス>": invalid foramt
と表示が出て鍵を追加することができませんでした。
ここで書いた対処を行えば無事鍵を追加することができました。 -
ssh-add -l
で秘密鍵が追加されているか確認ができます。
鍵のbit数,アルゴリズムの種類,フィンガープリント, 鍵の場所を確認することができます。 -
ここまで行けば後は、
ssh -T git@github.com
と打てば1.で示した成功メッセージが表示されるはずです。
お疲れ様でした。
躓いた所の対処
ssh-addで秘密鍵の追加ができない
上記の作業中にssh-addコマンドで鍵が追加できる事が分かったので、追加しようとしたのですがなぜかうまくいかない。
エラー文を見る限りフォーマットが違うとのことですがPUTTYGEN.exeで作成しただけで後はSourceTreeでは問題なかったので、いまいち分かっていませんでした。
調べていくうちにsshのフォーマットにもいくつか種類がある事が分かりました。
OpenSSH形式,PuTTy形式等がある事が分かり私の場合PuTTy形式のフォーマットの秘密鍵を追加しようとしてフォーマットが違うというエラーが発生していることが分かりました。
形式についてはこちらから引用します。
OpenSSH形式
OpenSSHのフォーマット。秘密鍵のヘッダーに以下の文字列。
-----BEGIN RSA PRIVATE KEY-----
SECSH(ssh.com)形式
---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
PuTTy形式
PuTTyのフォーマット。秘密鍵の拡張子はppk(Putty private key)。秘密鍵のヘッダーに以下の文字列。
PuTTY-User-Key-File-2: ssh-rsa
対処としては、PUTTYGEN.exeを起動し、PuTTy形式だった秘密鍵の形式をOpenSSH形式に変換するとssh-addで追加することができました。
雑感
GitHubにも今回使用した秘密鍵と対になる公開鍵は登録しており、SourceTreeでPushやPull等のリモートブランチの操作はできていたので、SSH接続は問題ない事は分かっていましたが、秘密鍵のフォーマットがSourceTreeがよしなにしてくれいたのだなと今更ながら感じました。
ここまで読んで頂きありがとうございました。