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デーモンは存在していませんでした。 その状態で、以下の記事通りで動作しました。
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
で見れます。
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での接続確認
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接続するよう設定します。
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接続に成功しました。
>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でハマりました。
- まず、git remote set-url originで設定する<url>はhttps用の<url>とssh用の<url>が異なります。ポート番号が22でもポート番号が443でもssh用の<url>を設定せねばなりません。
- <url>のhostnameの部分は、ssh.github.comでもgithub.comでも駄目です。 ~/.ssh/configのHostに設定した名前でないといけません。
- そして、これは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)
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を入れてるとエラーになる。
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とする。
fatal: Could not read from remote repository.
git remote set-url origin <url>で設定する<url>でssh接続は”:”を使わなければならないところを、https用の”/”を使っている。
おまけ OpenSSHの状況確認
windows openssh (OpenSSHのパスは環境変数のシステムPATHを確認)
get-acl C:\windows\system32\openssh | fl *
コメント