狐好きぷろぐらまー

狐好きプログラマー見習いのブログです。

ssh-addでinvalid formatが表示されて躓いた

こんにちは。 pregum_foxです。 今回は、WindowsのGit BashからGitHubsshで接続しようとした時に躓いたところをメモします。

目次です。

背景

今までは、 SourceTree というGUIのクライアントツールを使用して居ましたが、CUIで触れる方が良いと思い、コマンドプロンプトからsshで接続を試そうとしました。

前提条件

既にGitHubには今回SSH接続に使用する秘密鍵に対応する公開鍵が登録されていることが前提条件です。

f:id:pregum_fox:20200503012006p:plain
前提条件

作業環境

項目 内容
sshクライアント OpenSSH
OS Windows10 Home
ターミナル Git Bash

sshクライアントのバージョンは以下の通りです。

$ ssh -V
OpenSSH_7.1p2, OpenSSL 1.0.2h  3 May 2016

概要

簡単に説明すると

  1. SSH接続で使用する秘密鍵のフォーマットがOpen SSHのフォーマットではないというエラーがでる。
  2. PuTTY Key Generatorを使って作成した秘密鍵をOpen SSHのフォーマットに変換する。
  3. ssh-agentコマンドを叩く
  4. ssh-add <秘密鍵のファイルパス>コマンドを叩き、秘密鍵sshエージェントに追加する。
  5. ターミナルからGitHubの操作ができる!

原因

原因は上記にも記載した通り、登録しようとした秘密鍵のフォーマットが不正であったことが原因でした。 元々鍵はPUTTYGEN.exeを使用して作成しました。

作成手順は以下の記事に記載していますのでよければご覧ください。

pregum-fox.hatenablog.jp

対処方法

上記で使用したPUTTYGEN.exeを用いて秘密鍵のフォーマットをOpenSSH形式に変換すれば、ssh接続ができるようになりました。

図解

具体的な手順を図を用いて説明します。

  1. まずSSH接続ができていないことを確認する為にssh -T git@github.comとコマンドを叩きます。
    その時、Hi <名前>! You've successfully authenticated, but GitHub does not provide shell access.と表示されていればSSH接続はできています。お疲れ様でした。
    しかし、この記事をご覧になっている人はSSH接続ができていないはずなので、以下の画像の様にPermission denied (publickey).と表示されていると思います。

    f:id:pregum_fox:20200503004858p:plain
    SSH接続エラー
    されていなければ、違う箇所で問題が起きている可能性が高いのでこの記事はお役に立てないかもしれません。ごめんなさい。

  2. まずはssh-agentを起動します。
    単純にssh-agentとコマンドを入力しただけでは、sshエージェントが立ち上がらないので下図のようにeval `ssh-agent`と入力します。
    ssh-agentの両端に`をつけ忘れないように気を付けてください。
    f:id:pregum_fox:20200503005006p:plain
    sshエージェントの起動
  3. ssh-add <秘密鍵のパス>を叩いて秘密鍵を追加します。
    私はここでError loading key "<追加しようとしたパス>": invalid foramtと表示が出て鍵を追加することができませんでした。
    ここで書いた対処を行えば無事鍵を追加することができました。
    f:id:pregum_fox:20200503005038p:plain
    秘密鍵の追加
  4. ssh-add -l秘密鍵が追加されているか確認ができます。
    鍵のbit数,アルゴリズムの種類,フィンガープリント, 鍵の場所を確認することができます。
    f:id:pregum_fox:20200503010404p:plain
    sshエージェントに鍵が追加されているか確認
  5. ここまで行けば後は、ssh -T git@github.comと打てば1.で示した成功メッセージが表示されるはずです。
    f:id:pregum_fox:20200503010443p:plain
    無事成功

お疲れ様でした。

躓いた所の対処

ssh-addで秘密鍵の追加ができない

上記の作業中にssh-addコマンドで鍵が追加できる事が分かったので、追加しようとしたのですがなぜかうまくいかない。

エラー文を見る限りフォーマットが違うとのことですがPUTTYGEN.exeで作成しただけで後はSourceTreeでは問題なかったので、いまいち分かっていませんでした。

調べていくうちにsshのフォーマットにもいくつか種類がある事が分かりました。

OpenSSH形式,PuTTy形式等がある事が分かり私の場合PuTTy形式のフォーマットの秘密鍵を追加しようとしてフォーマットが違うというエラーが発生していることが分かりました。

形式についてはこちらから引用します。

OpenSSH形式

OpenSSHのフォーマット。秘密鍵のヘッダーに以下の文字列。

-----BEGIN RSA PRIVATE KEY-----

SECSH(ssh.com)形式

商用SSHのフォーマット。秘密鍵のヘッダーに以下の文字列。

---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----

PuTTy形式

PuTTyのフォーマット。秘密鍵の拡張子はppk(Putty private key)。秘密鍵のヘッダーに以下の文字列。

PuTTY-User-Key-File-2: ssh-rsa

PuTTYの使用する形式はPuTTY独自のものだが、OpenSSHや商用SSHと互換性があるように配慮されている。

対処としては、PUTTYGEN.exeを起動し、PuTTy形式だった秘密鍵の形式をOpenSSH形式に変換するとssh-addで追加することができました。

f:id:pregum_fox:20200503011303p:plain
鍵のインポート

f:id:pregum_fox:20200503011329p:plain
鍵の選択

f:id:pregum_fox:20200503011347p:plain
OpenSSH形式にフォーマットを変換する。

f:id:pregum_fox:20200503011421p:plain
警告

f:id:pregum_fox:20200503011432p:plain
OpenSSH形式の鍵の出力

雑感

GitHubにも今回使用した秘密鍵と対になる公開鍵は登録しており、SourceTreeでPushやPull等のリモートブランチの操作はできていたので、SSH接続は問題ない事は分かっていましたが、秘密鍵のフォーマットがSourceTreeがよしなにしてくれいたのだなと今更ながら感じました。

ここまで読んで頂きありがとうございました。

参考資料