Railsチュートリアル1章のGitでつまづいた「SSHで接続」のまとめ


この記事について

Railsチュートリアル(https://railstutorial.jp/#toc)の第1章(1.4)「Gitによるバージョン管理」に従って、
言われた通りにコマンドを打っているのにエラーが解決せずイライラ→無事解決までの経緯をまとめます。

はじめに

今回のエラー原因は、結果的には
①「言われた通りにやっているのに!」と思っていたが「言われてないこと」をやっていた
②チュートリアルには書かれていないが、デフォルト設定ではうまくいかない点があった
の2点でした。

この記事では、①について説明します。

※②について:Bitbucket上でリポジトリを作成する際、ReadMeを含めるとうまくいかない。
       チュートリアルでは一切触れられていないので注意。

エラーメッセージをググっても
「こういうエラーが出たから、こういうコマンドを打って直った」みたいなページはあるが、
それが自分のエラーに合致する事象なのかどうなのか?
自分のミスなのか、環境制約とかなのか?が、
なかなかわかりませんでした。

さっき打ったコマンドで、何がどうなってしまったのか?
そもそも今、何をどうしようとしていたのか?
何がどうなれば、解決なのか?
迷宮入りしておりました。

昨日の自分に伝えたい、今回わかったことをまとめます。

実施環境

Git含め、開発環境はRailsチュートリアルに従い、
AWSのCloud9というクラウドIDEを使用。
GitのリモートリポジトリにはBitbucket(https://bitbucket.org/account/signup/)を使用。

やった(つもりだった)こと

Railsチュートリアルの、1.4.3と1.4.4に書いてあることをそのままやったつもりでした。

<手順概要>
1.Bitbucketのアカウント作成
2.公開鍵の作成
3.Bitbucketへ公開鍵の登録
4.Bitbucketで新しいリポジトリの作成 ← ここで違和感発生
5.ブランチの作成
6.編集
7.コミット
8.マージ
9.プッシュ ← ここでエラー発生

実際にやっ(てしまってい)たこと

手順2で、公開鍵を作成せず、
手順3で、以前、GitHubへSSH接続するときに使った公開鍵を、Bitbucketに登録した。
手順4で、新しいリポジトリを作成する際、Readmeを含めていた。

出たエラーと大雑把な意味

※解釈が間違っていたら、是非ツッコミをお願いします!

エラーA(手順4あたり)

Warning: Permanently added the RSA host key for IP address 'xxx.xxx.xxx.xx' to the list of known hosts.

→このキーで'xxx.xxx.xxx.xx'にSSH接続するの、初めてですね?大丈夫ですか?

エラーB(手順9)

Permission denied (publickey).
fatal: Could not read from remote repository.

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

→SSH認証がうまくいっていません。よってアクセスできませんでした。

エラー原因

Cloud9からSSH接続をしようとしているのに、
ローカルからSSH接続するために作った鍵を登録していたから。

そもそもSSHとは?

SSH → 「秘密のやりとり」の実現が可能な接続方法。
SSHの「秘密のやりとり」 → パスワード認証、公開鍵認証の2パターン。

「秘密の」というのはつまり、私(ひよこ)以外の人からのアクセスを不正にするということ。

Railsチュートリアルの件の章では、この2パターンのうち
「公開鍵認証」をやろうとしています。

では公開鍵認証とは?

公開鍵と秘密鍵のペアを使って、本人であることの認証をおこなうやりかた。

って聞いてもよくわからない・・・鍵は公開したらまずいんじゃないの?

という人(私も)は、こちらのサイトが参考になりました。
妻に公開鍵暗号を教えてみた

いわく、公開鍵認証とは、南京錠のようなもの。
「南京錠そのもの」が“公開鍵”
「ロックを解除する鍵」が“秘密鍵”

南京錠そのものは、そのへんに転がしておいても大丈夫だし、
不特定多数の人に配布しても問題ない。
でも、解除する鍵だけは誰にも見せず、自分だけが管理する。
そういうことにしておけば、
「この南京錠を開けられるということは、私(ひよこ)本人だから、入ってきても良い」
という「秘密のやりとり」ができる、という仕組み。

逆手にとって、南京錠でロックしたものを私(ひよこ)宛に宅配して、
私(ひよこ)以外の人・・・たとえば家族とかがコレを受け取っちゃっても
うっかり中身を見られる心配がない、という「秘密のやりとり」にも使える。

※ダイヤルロックで例えたほうが感じが出るかな?と思いつつ、
 ロック解除状態でそのへんに転がしておくとナンバーがバレバレということに気づき、
 ややこしくなるのでやめました

・・・まぁ概念はなんとなくわかった。

何を認証するのか

ここがミスしたところ。
上記までの例示で、さんざん
「私(ひよこ)を認証」と書いてきてしまったが、
当然、
SSHが認識するのは生身の人間ではない。

じゃあ何かというと、
「私(ひよこ)が使っている端末で作った秘密鍵」だと思っていたんだけど
そこが違った。

おそらく正解は、
「私(ひよこ)が作業している環境に置いてある秘密鍵」。
これで「公開鍵を開けられる」がクリアできれば成功だ。

今回はクラウドIDEで作業しているので、
「私(ひよこ)が使っているクラウドIDEに置いてある秘密鍵」で
「公開鍵を開けられる」→認証成功
となる。

そう考えると
・そもそもクラウドIDE上にRSA鍵ペアを作っていない(認証しようがない)
・Bitbucketに登録した公開鍵はローカル環境のもの(クラウド上の秘密鍵で開くわけない)
・ローカル環境で作った公開鍵は、GitHubへの接続用に作ったものなので、
 「別のに使うの?」とワーニングが出た

という

勘違い三重苦みたいな状況でした。

対処

ここまで読めばやることは明白かと思いますが、

・クラウド上でRSA鍵ペアを作成する → keygen...のやつ
・ペアのうち、公開用(pub)をBitbucketに登録
・SSH接続を試みる

で、成功。

それぞれの手順は、Railsチュートリアルに書いてあるとおり。

おわりに

結果的には、「Railsチュートリアルに書いてあったことを、
飛ばさずに、すべて実施していれば問題なかった」のですが、

うっかり手順をとばし、エラーでどんづまったおかげで
改めて認証のことを勉強するいい機会になりました。
(というか、今までどれだけわかっていなかったのか。)