GitHub ssh git push connection reset by port 22 解決方法

Hi user_name! You’ve successfully authenticated…. と sshでつながっているみたいですが、git pushませんでした。 色々落とし穴があり、かなり検索したのですが、どれも解決策が載っていなく、自分であれこれ試してやっと解決しましたので、お役に立てればと掲載します。 SSHでPort 443を使う方法とPort 22の方法を両方掲載します。 (Windowsでの説明ですが、LinuxやMacでも同じ方法で解決できます。)

git remote set-url origin <url>nの<url>内のホスト名が~/.ssh/configのHostnameでなくHostと同じ出なければならず、異なっている時に発生する。 Hiまで出て来ている人は、『Port 443で接続』から読んでいただけたらいいと思います。

OpenSSHをインストール (Windowsの場合)

Windowsの場合、鍵を作る為に、OpenSSHをインストールが必要です。 OpenSSHのインストールは色々な人が分かりやすく書かれているので、ググってインストールしてください。

私のWindows10 PCには以前openSSHをインストールしてましたが、管理者権限で起動したPowerShellから以下コマンドを入力しても、sshdデーモンは存在していませんでした。 その状態で、以下の記事通りで動作しました。

管理者権限 PowerShell
Get-Service sshd

また、openSSHのインストール先は、環境変数のシステム変数のPATHを見たら、c:/windows/system32/opensshのフォルダに入っていました。

ssh認証用の鍵作成

セキュリティの高いed25519の暗号化を使った鍵を作ります。 (githubが対応している他の暗号化でも構いません) ssh-keygenを実行するフォルダに鍵が作られます。 一番良いフォルダは、~/.sshフォルダです。(~はホームを表し、windowsの場合は、c:/Users/<user_name>/のフォルダです。 PowerShellで cd ~ とするとホームフォルダに移動します。) ~/.sshフォルダは必ず必要なので作っておいてください。 .sshのドット”.”で始まるフォルダは隠しフォルダです。 PowerShellでは隠しフォルダやファイルはls -forceで見れます。

[tooltips keyword=’管理者権限 PowerShell’ content = ‘これは管理者権限でなくてもOKです。’]
ssh-keygen -t ed25519 -f git_ed_key
  • -f はファイル名。(なんでも構いません)
  • 『Enter passphase』と聞いてくるので、パスフレーズを入力(大文字小文字も区別します)。このパスフレーズを忘れたらこの鍵は使えなくなるのでちゃんとメモしておいてください。 もし忘れたら、再度作り直しましょう。
  • パスフレーズは2回聞かれるので、同じパスフレーズを入力しましょう
    • 或いは、上記コマンドの最後に、-P "passphrase"を入れると、確認用に打ち込んだ文字が見えるし、2度打ち込まなくても構いません。
  • すると、上記の指定したファイル名で秘密鍵ファイルと公開鍵ファイルの2つのファイルが現在のフォルダに生成されます。
    • git_ed_key  これが秘密鍵 (認証用)
    • git_ed_key.pub これが公開鍵 (githubに登録します)
  • 私の場合これらの鍵を、~/document/iot/git/.ssh2のフォルダに作りました。 後ほど~/.ssh/configファイルで鍵の場所は指定するので、鍵の場所はどのフォルダでも構いません。
  • すると以下の様な表示になり、2つのファイルが生成されてたことが分かります。

sshの公開鍵をgithubに登録

githubのアカウントは予め作っておいてください。

  • githubのサイトにログインして
  • 画面右上のロゴマークをクリックして
  • 『Settings』をクリックして設定画面に行きます。
  • (注意)このロゴマークから入る『Settings』は、アカウントの設定画面で、今回アカウント全体としてのsshの鍵登録をします。 Repository毎の『Settings』でDeploy keyに公開鍵を設定して、Repository毎にアクセス制限もできますが、ここでは説明していません。 以下の絵がRepository毎の『Settings』。
  • 左のメニューから『SSH and GPG keys』をクリック
  • 次に『New SSH key』ボタンをクリック
  • 公開鍵のファイルをNotePad++等で開き、中身を『key』の部分に貼り付け
  • 『title』は後々分かりやすい題名を入れたらいいです。 入力しなければ貼り付けた公開鍵の最後の部分がtitleになります。
  • 『Add SSH key』を押す。

この様に公開鍵が追加されました。

ここまでは何処でも載っている内容です。ここからが、ハマったところです。

  • Repositoryを選択して、『Code』ボタンをクリック
  • 『SSH』を選択する
  • リンクをコピーして何処かに保管しておく。(これは何時でもコピーできます)

Port 443で接続

会社のproxyサーバーは、在宅勤務でも会社パソコンのzscalerがある場合は、Port 22は許可されていない事が多いです。そこでgithubはhttpsで使うPort 443でssh出来る方法を記しています。

Port 443での接続確認

[tooltips keyword=’PowerShell’ content = ‘これも管理者権限でなくてもOKです。’]
ssh -T -p 443 git@ssh.github.com

Hi your_account_name! You’ve successfully….と出てきたらsshがつながる確認が出来ました。

  • -Tは結果を表示する為のオプションです。
  • -pはポート番号を指定しています。 
  • メッセージにも出て来ているように、githubはshellを提供しません。 なので-Tを付けなければ、接続成功しても何も表示されないので、成功したかどうかが分かりにくい為です。

githubに443接続方法が書かれています。

しかしこれだけではgit pushやcloneは出来ません。 ここからが本題です。

git pushでの問題

git push するには2つの問題がありハマりました。

git push 認証問題 ~/.ssh/configで解決

正しいremote set-url originの<url>が設定できても、先ほどのssh -T -p 443 ….で実行しても認証用の秘密鍵が指定されていないので、正しい<url>設定後にgit pushする時に認証エラーとなりました。 そこで、秘密鍵を指定できるように、~/.ssh/configファイルに秘密鍵を使いssh接続するよう設定します。

~/.ssh/config
Host github443
    User git
    Hostname ssh.github.com
    Port 443
    IdentityFile ~/Documents/IoT/git/.ssh2/git_ed_key
  • ~/.ssh/config (=c:/Users/<user_name>/.ssh/config)が無ければ、NotePad++等で作りましょう。 拡張子は無しです。
  • このconfigはopensshがssh接続する時に、~/.sshにある設定ファイルのconfigを見に行きます。 なので、~/.sshフォルダはWindows、Linux問わず必ず必要なのです。
  • 上のサンプルを貼り付ける。
  • Host の名前は何でも構いません。 私はgithub443と勝手な名前を付けました。
  • User はgitでなければなりません。
  • Hostnameはssh.github.comでなければなりません。
  • IdentityFileは最初に作った秘密鍵のパスです。 フルパスでなく~をホームフォルダとして使う時はフォルダの区切りは”/”でなければなりません。 c:から始まるフルパスの場合はフォルダの区切りは”\”を使っても構いません。(これもちょこっとハマりました)
  • ~/.ssh/configを保存したら
  • sshしてみましょう。 ssh -T github433 で接続。
  • 秘密鍵のパスフレーズを聞いてくるので、秘密鍵を作った時に入れたパスフレーズを入力。
  • Hi your_account_name! が出てきたら秘密鍵を使った認証をしてssh接続に成功しました。
PowerShell
>ssh -T github443
Enter passphrase for key 'C:\Users\username/Documents/IoT/git/.ssh2/git_ed_key':
Hi your_account_name! You've successfully authenticated, but GitHub does not provide shell access.

これで、github443 だけで~/.ssh/configに設定した 『Host github443』を見に行って、Port 443を使い、git@ssh.github.comに接続しています。

[tooltips keyword=’set-url’ content = ‘remote addの場合、urlが登録されている場合、先にrmで削除しなければならないが、set-urlは削除しなくても上書き変更ができる。’]

git remote set-url origin の <url> 設定問題 — ここがめちゃヤバい

これが最もややこしかったです。 問題は、特に1と2でハマりました。

  1. まず、git remote set-url originで設定する<url>はhttps用の<url>とssh用の<url>が異なります。ポート番号が22でもポート番号が443でもssh用の<url>を設定せねばなりません。
  2. <url>のhostnameの部分は、ssh.github.comでもgithub.comでも駄目です。 ~/.ssh/configのHostに設定した名前でないといけません。
  3. そして、これはsshには関係ないのですが、いろんなサイトでrepository_nameと書かれているので、.gitを末尾に付けずにするとエラーになります。

なので正しい<url>はgit@github443:account_name/repository_name.gitとなります。 私の場合、account_nameがplcs2ecoで、repository_nameがchrome_extensionになります。

PS C:\Users\username\Desktop\nodejs\test\my_chrome_ext_clock> git remote set-url origin git@github443:plcs2eco/chrome_extension.git
PS C:\Users\username\Desktop\nodejs\test\my_chrome_ext_clock> git remote -v
origin  git@github443:plcs2eco/chrome_extension.git (fetch)
origin  git@github443:plcs2eco/chrome_extension.git (push)

色んな組み合わせで<url>を試し、その組み合わせと認証の問題の両方が入交り、まる一日かかりました。

以下の様に、ssh接続後、pushして再度パスフレーズを入力すると、pushに成功しました。(VScodeのTerminalでPowerShellを実行しています。)

Hostにgithub443としたが、これをgithub.comに置き替えると、ssh -T github.comでssh接続でき、<url>はgit@github.com:plcs2eco/chrome_extension.gitとなる。 また、ssh -T git@github.comとUser名を入れても構わないです。

Port 22が使える場合

Port443の方法と違うのは、~/.ssh/configの設定だけ。 後は<url>もPort 443と同じように設定。

  • Port 443の時は、Hostname ssh.github.com これはgithubがsshでPort 443が使える様に特別に用意しているドメイン名。
  • Port 22 の時は、Hostname github.com
  • Port 443の時は、Port 443
  • Port 22の時は、Port 22
  • UserとIdentityFileはPort443と同じです。
  • Hostは識別に使われるので、Port443とは異なる名前にする必要があります。 以下の例ではgithub22にしています。
  • <url>はPort 22用のHost名を使うだけ。(以下の例ではgithub22)
~/.ssh/config
Host github22
    User git
    Hostname github.com
    Port 22
    IdentityFile ~/Documents/IoT/git/.ssh2/git_ed_key

上記の~/.ssh/config内のPort 22用のHostに書いた名前をgit remote set-url origin <url> の<url>の@の直後に書く。 そしてssh通信なので、”:”で繋げる

git@github22:acount_name/repository_name.git
git@github22/acount_name/repository_name.git    //ssh通信時は"/"はエラーになる。
github22:acount_name/repository_name.git        //UserはConfigに書いてあるのでgit@は省略できる。
git@github.com:acount_name/repository_name.git  //User名は書いてもエラーにならないのに、Hostnameを入れてるとエラーになる。
Power Shell
PS C:\Users\username\Desktop\nodejs\test\my_chrome_ext_clock> git remote set-url origin git@github22:plcs2eco/chrome_extension.git
PS C:\Users\username\Desktop\nodejs\test\my_chrome_ext_clock> git remote -v
origin  git@github22:plcs2eco/chrome_extension.git (fetch)
origin  git@github22:plcs2eco/chrome_extension.git (push)

これでgit cloneやpushも出来るようになりました。 

おまけ エラー

これらの解説が見つからなかったので以下は、私が解決できた現象からの推測の部分が多々あるので、間違っていたら、是非コメントでご指摘頂けると嬉しいです。

Connection reset by 54.168.17.15 port 22

Connection reset by 54.168.17.15 port 22
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

上の例の様に~/.ssh/configにPort 443用を設定して、git remote set-url origin <url>の<url>の設定が、

git@github443:plcs2eco/chrome_extension.git    //これはpush出来る。
git@ssh.github.com:plcs2eco/chrome_extension.git  //この時にこのエラーになる。 
//ssh.github.comでもいいと思ったが、~/.ssh/configのHostにかかれている名前でないとエラーになる。

ssh -T githubでssh: Could not resolve hostname github

ssh -T ホスト名と~/.ssh/configのHostで宣言しているホスト名の下にあるHostnameが正しくない。 例えば、Port 443を使っているのに、Hostname github.comとなっている場合。 正しくはHostname ssh.github.comとなっていないといけない。 逆にPort 22の場合に、Hostname ssh.github.comとなっているとエラー。

ssh_dispatch_run_fatal: Connection to 52.69.186.44 port 22: Connection timed out

Port 443でsshしたいので、ssh -T -p 443 git@ssh.github.comとして、Hi ….!が出来てつながったと思ったのに、git remote set-url origin で設定した<url>のホスト名が、github.comとなっているので、再度Port 22で接続しようとした場合のエラー。 Proxyの後ろではPort 22と接続できないのでタイムアウトとなる。 

proxyがあるとPort 22が通らないので、その時は443を使い、<url>のホスト名は正しく、ssh.github.comとする。

Using SSH over the HTTPS port - GitHub Docs
Sometimes, firewalls refuse to allow SSH connections entirely. If using HTTPS cloning with credential caching is not an ...

fatal: Could not read from remote repository.

git remote set-url origin <url>で設定する<url>でssh接続は”:”を使わなければならないところを、https用の”/”を使っている。

おまけ OpenSSHの状況確認

windows openssh (OpenSSHのパスは環境変数のシステムPATHを確認)

PowerShell
get-acl C:\windows\system32\openssh | fl *

コメント