TL;DR

先日windowsマシンにて、backlogのリポジトリへssh接続にてpushを行うにあたって若干ハマったので備忘録です。
vscodeからでもコマンドからでも実行できるようになります。
なににハマったのか?
ssh接続を行うにあたって必要なのが、当然ながら公開鍵と秘密鍵が必要になってきます。
そこでssh-keygenを叩いたのですが、鍵の名前を何にするか聞かれます。
自分の環境には、すでにC:\Users\ユーザー名\.ssh配下にデフォルトの名前である、
- id_rsa(秘密鍵)
- id_rsa.pub(公開鍵)
があり、「はいはいすでにおるもんな。(チガウナマエツケー)」で鍵を作成。
公開鍵を意気揚々とbacklogへ登録し、いざpush!
…しても、当然ssh接続時にエラーとなりました。
原因は、「当該backlogのリポジトリへのssh接続にあたって、どの鍵を使うのか?」をsshちゃんが分かってないからだなとすぐに気づいたのですが、Windowsマシンでsshの設定ってどうするんだ?となったので、その時に調べたことのメモとなります。

というわけで以下、設定方法
なにはともあれssh-keygen
そもそもなのですが、なにも考えずWindowsマシンでssh-keygenって叩きましたが、いつのまにかWindowsには標準でOpenSSLが搭載されてたんですね。
ssh-keygen
今回はテストなので特に鍵長とか暗号化方式は指定なしのデフォルトでやってます。
で、ssh-keygenを叩くと鍵の作成場所とパスフレーズを聞かれます。
今回はC:\Users\user/.ssh/id_rsa_sshtestという名前で鍵を作るように指定しました。
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\user/.ssh/id_rsa): C:\Users\user/.ssh/id_rsa_sshtest
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\user/.ssh/id_rsa_sshtest.
Your public key has been saved in C:\Users\user/.ssh/id_rsa_sshtest.pub.
The key fingerprint is:
SHA256:5EHGvPC8R2Pn2VHqegP8bukfdV9Eau8fqIa/VbGz7aU user@DESKTOP-TGTG3QG
The key's randomart image is:
+---[RSA 3072]----+
| oo .|
| .oo o.|
| +o. o+.|
| o+.+ ..ooo|
| S+ = + ==|
| . . = =.O|
| .. * ==|
| . .+ *o=|
| o+.=Eo+|
+----[SHA256]-----+
作成した公開鍵をgithubに登録する
backlogは業務で使っているのですが、私用では登録していないので、今回はかわりにgithubを使って説明します。
backlogの公開鍵の登録方法はとても簡単で、ヘルプページを見ればすぐにできると思います。
ここで説明するgithubへの登録方法とほぼ同じ(画面が違うだけ)なので、ここでの説明を置き換えていただければ大丈夫です。
backlogへの公開鍵の登録方法は以下をご参照ください。
https://backlog.com/ja/git-tutorial/reference/ssh/
githubのプロフィールアイコンをクリックして表示される、「Settings」をクリック。

表示されたページ左側のメニューバーにある、「SSH and GPG keys」をクリック。

「New SSH Key」をクリック。

ここで表示されたページに、先ほどssh-keygenで作成した公開鍵を登録します。
ここでの例だと、「ssh-keygenの結果」の6行目に表示されていた、「C:\Users\user/.ssh/id_rsa_sshtest.pub」が公開鍵なので、このファイルをテキストエディタで開いて、コピー。

そして、いかにペーストして「Add SSH key」を押下。


ここまでで接続の準備は完了です
ssh接続の疎通テスト
接続の準備はできたので、さっそくテストしていきたいと思います。
まずはgithubにリポジトリを作成し、ssh接続情報を確認します。

今回の場合、git@github.com:ysknsid25/sshtest.gitが接続情報になっています。
で、テストのために以下のコマンドを叩く。
ssh -vT -i C:\Users\user\.ssh\id_rsa_sshtest git@github.com
C:\Users\user.ssh\id_rsa_sshtestは作成した秘密鍵のフルパスを指定してください。
git@github.comはsshユーザーとホスト名で、gitがユーザー。github.comはホスト名です。
ここでは説明のため秘密鍵のフルパスを公開していますが、秘密鍵は絶対に漏れないように管理してください
上記のコマンドを叩いた結果、以下のようなログが出ていれば接続成功です。
Hi ysknsid25! You've successfully authenticated, but GitHub does not provide shell access.
今度はgitコマンドに秘密鍵を設定していく
さっきまでの手順ではsshコマンドでのテストに過ぎず、sshコマンドの引数として使用する鍵を指定しました。
しかし、あくまでやりたいことはgitコマンドでssh接続することなので、さきほどのsshコマンドでのテストのように、使用する鍵を都度指定できるわけではありません。
ということは、gitコマンドが発行される際に、「とあるgitのリポジトリ(ホスト)と通信する際にはこの鍵を使ってね」と設定する場所があるはず。
それが、C:\Users\user/.ssh/configファイルです。
存在しない場合には、上記の場所にconfigファイルを作成して、以下のように記載してください。
存在する場合には、configファイルに以下のように追記してください。
Host github
HostName github.com
IdentityFile C:\Users\user\.ssh\id_rsa_sshtest
User git
ポイント
Host: 鍵を使い分ける単位を指定するためのもの。区別できればなんでもいいです。
HostName: git@github.com:ysknsid25/sshtest.git のうち、 github.comが該当。
IdentityFile: 当該ホストへの接続に使用したい秘密鍵のフルパス
User: HostName: git@github.com:ysknsid25/sshtest.git のうち、 gitが該当。
ここまでを設定したうえで、ssh -Tコマンドを今度は鍵を指定せずに叩いてみる
ssh -T git@github.com
すると…?
Enter passphrase for key 'C:\Users\user\.ssh\id_rsa_sshtest':
Hi ysknsid25! You've successfully authenticated, but GitHub does not provide shell access.
鍵を指定せずとも接続ができるようになりましたね!
毎回パスフレーズを求められないように設定を加えていく
鍵の指定を省略できるようにはなりましたが、相変わらずパスフレーズの入力を求められている模様。
うっとうしいので、なんとかしたいです。
そこで使うのがssh-agentです。以下のコマンドを叩きます。
ssh-add C:\Users\user\.ssh\id_rsa_sshtest
このとき、エラーなく実行できた人はラッキーです。次の手順7へ進んでください。
しかし、ほとんどの人が以下のようなエラーに出くわすと思います。
Error connecting to agent: No such file or directory
これは、ssh-agentというサービスが動いてないことに起因しています。
ssh-agentがPC起動時に自動で立ち上がるように設定していく
「タスクマネージャー」>「サービス」>「サービス管理ツール」を選択

開いた画面で「OpenSSH Authentication Agent」を探してみると、「状態」が「停止」になっていると思います。
(私はすでに設定済みのため、実行中ですが…)

上の画面の 「OpenSSH Authentication Agent」 を選択した状態で右クリックし、「スタートアップの種類」を「自動」にします。
その後、「適用」>「OK」を押下します。

あとは「状態」が「停止」であれば、左の赤丸部分に「サービスの開始」が表示されているはずなのでクリックし、開始させます。
状態が「実行中」になればOKです。

再度ssh-agentに鍵を登録していきます
ssh-add C:\Users\user\.ssh\id_rsa_sshtest
すると、今度はエラーが表示されず、パスフレーズの入力を求められるはずです。
言われた通り入力してあげます。
Enter passphrase for C:\Users\user\.ssh\id_rsa_sshtest:
Identity added: C:\Users\user\.ssh\id_rsa_sshtest (user@DESKTOP-TGTG3QG)
すると、上のように「Identity added」に続けて、秘密鍵のフルパスが表示されます。
これでパスフレーズをssh-agentが覚えてくれました。
ではパスフレーズが省略できるか確認
ssh -T git@github.com
パスフレーズを聞かれることなく、以下のメッセージが表示されればOKです。
Hi ysknsid25! You've successfully authenticated, but GitHub does not provide shell access.
gitがssh-agentを利用するように設定する
ここまで出来れば、sshでの接続はばっちりです。
いよいよこの設定をgitに適用します。
以下のコマンドを実行します。
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
これ、何をしているかというと、Gitの設定を、WindowsのOpenSSHを見に行くように変更しています。
この設定ができてないと、先ほど設定したはずのパスフレーズを聞かれたり、vscodeからpushしようとしたときに、id_rsa.pubというデフォルトの名前以外で鍵を作った場合の C:\Users\user/.ssh/config を見に行ってくれないため、エラーが発生します。
git で push
さあ、仕上げに入りましょう!
ここまでくれば、後はなんてことないです。
親の顔よりみたコマンドを叩いていきます。
git remote add origin git@github.com:ysknsid25/sshtest.git
git push -u origin master
無事にpushできました。

また、適当にファイルを変更し、コミット後、今度はvscodeからpushします。

vscodeで実行しても、エラーにならず実行できました。

以上です。おつかれさまでした!