RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

GitHubへのsshログインも楽したい!よくある接続エラーもまとめたよ!

こんにちは、あるいはこんばんは。すぱ..すぱらしいサーバサイドのエンジニアの(@taclose)です☆

みなさん、sshでパスワード不要にする記事は読んでくださいましたか?
今回はその続編とも言える記事になります。

ネットで調べてるとどうもGitHubにログインするsshの設定で苦労されてる内容をよく見かけます。
今一度何が正しくて、どんなエラーが出た時はどうしたら良いのか?を整理しました
誤った理解でそれっぽい設定しちゃってる方もおられるようなので、今一度振り返ってみてもらえればと思います。

まずはSSHの設定の基礎的な事(自信ある人は飛ばす!)

2021年8月13日からGitHubでパスワードによる認証が廃止されました。
一応別口も用意されていますが、安全性や利便性を考えればsshでのログインに切り替える良いタイミングです!

以下の記事を参考にしながら、まずはssh/configの基本的な記載方法と便利さを実感してください。
なんとなく理解出来てるよって人は、不明点があれば参考にしてくださいね。

tech-blog.rakus.co.jp

では次へいきましょうっ

GitHubのサーバ側の設定をしよう!

まずは公開鍵の作成

今回はあえて個人用のアカウント(taclose)と会社用のアカウント(officer)がある前提で記載します。既に公開鍵作ってるよ!という方は公開鍵は使いまわしても問題ないのですが、さすがに個人用と仕事用は使い分けるので、まずは鍵の作成から入りましょう!

鍵の作成時に鍵の名前指定を忘れずに!id_rsaファイルを上書きしちゃうの!?ってssh-keygenに心配されちゃいますよ!

# 個人開発用の鍵の作成 名前指定忘れずにね!(今回はid_rsa_tacloseとしました。自由に!)
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa): id_rsa_taclose # ここ!
Enter passphrase (empty for no passphrase): # 何も書かずにEnter
Enter same passphrase again: # 何も書かずにEnter

# 鍵の移動(秘密鍵と公開鍵両方移動させましょう)
$ cp -pr id_rsa_taclose* ~/.ssh/

# 権限を変更 秘密鍵のアクセス権は600に変更しましょう。
$ chmod 600 ~/.ssh/id_rsa_taclose

# GitHubに公開鍵を持ってく必要があるのでクリップボードにコピーする。
$ pbcopy < ~/.ssh/id_rsa.pub # (Mac)ならこうっ
$ clip.exe < ~/.ssh/id_rsa.pub # (Windows)ならこうっ
$ cat ~/.ssh/id_rsa.pub # こんなのでも良い!(表示された内容を選択してCtrl+C)

もし会社用の公開鍵も用意するなら、同じ要領でid_rsa_officerとか作って下さいね!

GitHubに公開鍵を設定しよう!

  1. GitHub にアクセスしてログインしてください。
  2. 右上のユーザアイコンをクリックし、Settingsを選択
    GitHubユーザアイコンを選択してSettingsを選ぶ
  3. 左メニューのSSH and GPG keysを選択
    SSH and GPG keysを選びましょう
  4. New SSH key ボタンを選択
    New SSH keyを選択
  5. タイトルはusername等適当な値でOKです。Key Type: Authentication Keyとし、先ほどコピーした公開鍵を張り付けてAdd SSH key
    Add SSH key

これでサーバ側の設定は完了です☆

GitHub用に記載すべきssh/configはこれで決まりだ!!

まず答えを書きます!

[root@A8630-LT keisuke.maeda]# cat ~/.ssh/config
Host *                           // (1)
  ServerAliveInterval 60
  IdentitiesOnly yes
  TCPKeepAlive yes

Host __github.com.*              // (2)
  Hostname ssh.github.com
  Port 443
  User git

Host __github.com.taclose        // (3)
  IdentityFile ~/.ssh/id_rsa_taclose

Host __github.com.officer        // (4)
  IdentityFile ~/.ssh/id_rsa_officer

(「あ〜なるほどね、うんうん」という人は次にいきましょうっ)

解説します。

(1)どこに接続する時もこの設定

Hostって部分が俗にいうエイリアス(別名)をつける部分ですが、* や ?とかが指定可能です。

Host *みたいに正規表現で書いておけば、どのHost設定にも共通の設定として記載できます。
なので、SSHの接続がぷつぷつ切れて困ってるんです」 とか 秘密鍵を使い分けてるんですが、どうもうまくいかない」 そういう人は共通設定にこれ入れておけば安心ですね!

(2)Host __github.com*

(1)の説明と重複しますが、こんな風に定義しておけば 『__github.com~みたいな設定は共通でこういう定義ね!』と出来ます。
私の作業するNWではgithub.comに対してport 22番での通信が出来ませんので、

  Hostname ssh.github.com
  Port 443

という定義をGitHubに接続する共通の設定にしていますが、ここは以下のようにする人も多いかもしれません。

  Hostname github.com
  Port 22

後半によくあるエラーの対策方法の説明があるので、そこで詳細に触れましょう!今は

GitHubへのssh接続で22ポート使える人とそうじゃない人がいるのか。GitHubは443ポートでもできるんだ。」

ぐらいで思っておいてもらえればOKです。

(3)個人用/会社用のGitHubへの接続設定

よく見かけるsshの設定方法の説明だと1つのHostに対して何度もHostname, port, User等を定義しているのを見かけますが、共通化して書く事でここまで綺麗にかけるんですね!

でも秘密鍵を使い分けてるだけで本当にアカウント使い分けできてるの?と思われるでしょう。

以下がコマンドの実行例です。

[root@A8630-LT keisuke.maeda]# ssh -T __github.com.taclose
Hi taclose! You've successfully authenticated, but GitHub does not provide shell access.
[root@A8630-LT keisuke.maeda]# ssh -T __github.com.officer
Hi kmaeda-rakus! You've successfully authenticated, but GitHub does not provide shell access.

おお!sshでの接続テストをしてみたところ、Hi taclose!とかHi kmaeda-rakus!と呼び分けてくれてますね! 秘密鍵に紐づいたアカウントを自動で選択してくれているわけですね!

実際 __github.com* の設定をみても、User gitとしており、tacloseなんてうたってないわけですが、こんな結果になるわけです。

すぱ..すぱらしい!!エレガント!

GitHubに接続できない!エラー別対応法

さて、では接続出来なかった人のためによくあるケースを元に対策を記載まとめていこうと思います。

と、その前に接続テストの方法は以下になります。ssh/configの記載は各自の内容に読み替えて実施してくださいね!
私の場合は以下になります。

# ssh/configでUserやHostname設定してあるのでこうなる
# 意味としては「ssh -T git@ssh.github.com -i ~/.ssh/id_rsa_taclose -p443」これと同じ意味になります。
$ ssh -T __github.com.taclose 

# 接続うまくいかない時は -vTにすると原因がわかりやすい事もありますよ!エラー例も載せておきます。
# これをみたらport何番使おうとしてるのか?とかがよくわかりますね!設定ミスにも気づけます。(わざとport 22使ってエラー出してます)
$ ssh -vT __github.com.taclose 
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /root/.ssh/config
debug1: /root/.ssh/config line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to github.com [20.27.177.113] port 22.
debug1: connect to address 20.27.177.113 port 22: Resource temporarily unavailable
ssh: connect to host github.com port 22: Resource temporarily unavailable

ssh: connect to host github.com port 22: Resource temporarily unavailable

このエラーが出た人は今いるNW環境がGitHubに対するport 22が許可されていない事が考えられます。
私もこれに該当していたのでそんな人は私が先ほども記述していた以下のような設定を試して下さい。
以下の設定はGitHubに443ポートでアクセスする設定です。

Host __github.com.*
  Hostname ssh.github.com # ここがgithub.comじゃないよ!
  Port 443                # ここが22じゃないよ!
  User git

Permission denied (publickey).

これは一番よくみるエラーかもしれません。

秘密鍵や設定ファイルのパーミッションが良くない例

# 正しいパーミッション (userやgroupの列は気にしないで下さいね!私はWSLでさくっと環境準備したのでrootになってます。)
$ ls -al ~/.ssh/
drwx------ 1 root root  512 1219 19:06 .
-rw------- 1 root root 1904 1219 19:06 config
...
-rw------- 1 root root 1675  33  2022 id_rsa_taclose
...

# 設定ずれてる方は以下のコマンドを実行しましょう
$ chmod 700 ~/.ssh                # .sshフォルダは700
$ chmod 600 ~/.ssh/config         # 設定ファイルは600
$ chmod 600 ~/.ssh/id_rsa_taclose # 秘密鍵は600

よくわからずUser名をgitじゃなくした例

たまにあるのが、Userという設定項目だから無条件にgitという値を使わずにtacloseとかにしちゃう例です。例えば以下。

# taclose@じゃないよ!git@だよ!エラーになるよ!
$ ssh -T taclose@ssh.github.com -i ~/.ssh/id_rsa_taclose -p443
Permission denied (publickey).

sshの接続では常にユーザはgitです!お忘れなく

もしここまできてもこのエラーが治らない人は -vTで詳細な理由を確認してみてください。
実はconfigファイルに記載した秘密鍵のファイルパスが間違ってるだけでも以下のようになります。

$ ssh -T __github.com.taclose
no such identity: /root/.ssh/id_rsa_taclose2: No such file or directory
Permission denied (publickey).

悩んだらまず -vT お忘れなく!

いざgit cloneしたら出来ないんですけど!

GitHubにアクセスして、リポジトリを確認したらこんな風になってるはずです。

GitHubリポジトリ(SSH)

じゃ、Cloneするかな!って実行すると・・・?

# git clone git@github.com:taclose/mkmotd.git
Cloning into 'mkmotd'...
ssh: connect to host github.com port 22: Resource temporarily unavailable
fatal: Could not read from remote repository.

はい、こけちゃいます。ssh/configに設定したのはあくまで__github.com.tacloseなので以下のように書けばいけます

# git clone __github.com.taclose:taclose/mkmotd.git
Cloning into 'mkmotd'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 13 (delta 2), reused 8 (delta 2), pack-reused 0
Receiving objects: 100% (13/13), 4.07 KiB | 0 bytes/s, done.
Resolving deltas: 100% (2/2), done.

『でも、デフォルトでいきたいんですけど!』 って人はssh/configの設定を以下のように修正するといけますよ。

github.comのデフォルトを追加

Hostの所には半角スペース区切りで複数定義できます。なので、github.comと言われれば__github.com.tacloseの設定を使ってねってしたわけですね!

これでさっきのコマンドを打つと・・・?

[root@A8630-LT tmp]# git clone git@github.com:taclose/mkmotd.git
Cloning into 'mkmotd'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (8/8), done.
Receiving objects: 100% (13/13), 4.07 KiB | 0 bytes/s, done.
Resolving deltas: 100% (2/2), done.
remote: Total 13 (delta 2), reused 8 (delta 2), pack-reused 0

成功!

最後に

ssh接続失敗系のエラーはたくさんありますが、GitHubの場合はサーバ側はGitHubがよしなにやってくれてます。だから、案外コピペミスとかNW設定周りぐらいしか原因はないです。

ただ、Macユーザにとっては当たり前ですが、ssh-addが必要とかはあるので、そういった点は参考文献にも記載しましたが

GitHub Docs: SSH のトラブルシューティング

ここでも解説されてるものがあります。公式のトラブルシューティングなので見てみると良いかもしれませんね!

エラーに屈せず、勉強の機会にしちゃいましょう!お疲れ様でした!

参考文献

実践sshコマンド:基本からオススメの設定 / ノウハウをまとめたよ! - RAKUS Developers Blog | ラクス エンジニアブログ

GitHub Docs: SSH のトラブルシューティング


エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
20210916153018
https://career-recruit.rakus.co.jp/career_engineer/

カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.com

ラクスDevelopers登録フォーム
20220701175429
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/

イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!

◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.