この記事の内容
新しいPC(MacBook Air)でGitHubにgit pushしようしたところ、下記の認証エラーでpushできませんでした。
本記事では、何が起こっていたのか、解決するために行ったSSHキーの設定とリポジトリURLの切り替え方法をまとめます。
hoge@hogehoge % git push -u origin main
Username for 'https://github.com': hogehoge
Password for 'https://hogehoge@github.com':
remote: Invalid username or token. Password authentication is not supported for Git operations. fatal: Authentication failed for 'https://github.com/hogehoge/hogehoge.git/'
何が起こっていたのか
今回のエラーの要因は大きく2つです。
-
GitHubはGit操作における「パスワード認証」を廃止している。(HTTPSでパスワードを入れても通らない)
にも関わらず、パスワードを使ってpushしようとした - リポジトリへのアクセス先(remote URL)がHTTPSのままだった(SSHで認証したいならSSHのURLにする必要がある)
一つずつ見ていきます。
GitHubがパスワードを使ったアップロードを禁止している
git pushした際にUsernameとPasswordの入力を求められましたが、GitHubはGit操作における「パスワード認証」を廃止しています。そのためパスワードを入力しても認証に失敗します。
HTTPSでpushする場合は「パスワード」ではなく Personal Access Token(PAT) が必要ですが、今回は SSH に切り替えて解決しました。
リポジトリへのアクセス先がHTTPSになっていた
後述の方法SSHキーを作っても、リポジトリの remote URL が https://github.com/... のまま(HTTPS)だと、push 時に HTTPS で接続してしまい、再び Username/Password を聞かれます。
SSHキーで認証したい場合は remote URL を git@github.com:... の形式(SSH)に変更する必要があります。
解決手順
やったことは下記の2つです。
- SSHキーを作成してGitHubに登録する
- リポジトリへのアクセスをSSH経由にする(remote URLを変更)
SSHキーを作成してGitHubに登録する
SSHキーの作成
SSHキーの作成は下記のコマンドでできます。
ssh-keygen -t ed25519
-
ssh-keygen: SSH鍵を作る標準ツール(macOS/Linuxに標準で入っていることが多い) -
-t ed25519: 作る鍵の種類(type)を ed25519 にする。 ed25519は安全で最近推奨されているタイプらしい。
上記のコマンドを実行すると ~/.sshに公開鍵と秘密鍵が生成される。
パスフレーズは設定しないでEnter押してもOK。
hoge@hogehoge ~ % ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_ed25519):
Created directory '/Users/hogehoge/.ssh'.
Enter passphrase for "/Users/hogehoge/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/hogehoge/.ssh/id_ed25519
Your public key has been saved in /Users/hogehoge/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:cm9gPQcEq42jyVcUbA2EWQSbFnpH42XHbAt/CVcchqg
The key's randomart image is:
+--[ED25519 256]--+
| oOX++oo .=o|
| .o*oBoo=.o .|
| . =.= o+ + . |
| o * E .o o |
| = S o .. |
| . o * o o |
| + . o |
| . . |
| |
+----[SHA256]-----+
hoge@hogehoge ~ % ls ~/.ssh
id_ed25519 id_ed25519.pub known_hosts known_hosts.old
-
id_ed25519: 秘密鍵。(絶対に共有しない) -
id_ed25519.pub: 公開鍵(GitHubに登録する)
ssh-agentにキーを追加する
鍵が1つで、かつパスフレーズ無しなら必須ではありません。
ただし、パスフレーズを付けて毎回入力したくない場合や、鍵が複数あって使い分けたい場合は設定しておくと楽です。
configファイルを用意
~/.ssh/ にconfigファイルがなければ下記で作成。あればgitの設定を追記する。
これを設定しておくことでキーが ssh-agent に自動的に読み込まれ、パスフレーズがキーチェーンに格納されるようになる。
touch ~/.ssh/config
↓configに追加する設定
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
SSHキーを追加
下記コマンド実行でSSHキーをssh-agentに追加する。
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
GitHubにSSHキーを登録する
id_ed25519.pubの中身をコピーします。macの場合は下記コマンドでコピーできます。
pbcopy < ~/.ssh/id_ed25519.pub
GitHubのページへ行き、Settings → SSH and GPG keys → New SSH keyで鍵をペーストし登録します。
ターミナルで下記を実行して成功っぽいものが出ればsshでの接続ができています。
hoge@hogehoge % ssh -T git@github.com
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.
リポジトリへのアクセスをSSH経由にする
まず、下記で接続先を確認します。
git remote -v
https://github.com/... から始まっている場合は接続先URLをSSHにする必要があります。下記でできます。
git remote set-url origin git@github.com:hogehoge/hogehoge.git
これで git push 時に Username/Password を聞かれず、SSH鍵で認証されるようになります。
参考