【Railsチュートリアル第一章】BitbucketでPermission denied (publickey)と言われたときの対処法

## はじめに

※この記事は現在Railsチュートリアルに取り組んでいる方向けの記事です。

先日、生徒さんから

「RailsチュートリアルのBitbucketの設定でつまづいてしまいました。。。」

と質問されました。

無事に解決できたのですが、せっかくなのでその解決方法をまとめようと思い、記事にすることにしました。

## 生徒さんからいただいた質問の内容

======
【ご質問】
@ウェブ系ウシジマくん

RailsチュートリアルのBitbucketの設定でつまづいてしまいましたので、アドバイスを頂戴したく。

◯つまづいた箇所
`Bitbucketへのリポジトリ追加とプッシュができない`

◯エラーログ

```bash

ec2-user:~/environment (master) $ cd hello_app
ec2-user:~/environment/hello_app (master) $ git remote add origin git@bitbucket.org:ec2-user/hello_app.git
fatal: remote origin already exists.
ec2-user:~/environment/hello_app (master) $ git remote rm origin
ec2-user:~/environment/hello_app (master) $ git remote add origin git@bitbucket.org:ec2-user/hello_app.git
ec2-user:~/environment/hello_app (master) $ git push -u origin master
Permission denied (publickey).
fatal: Could not read from remote repository.

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

◯試したこと
・一旦rmで消去して、もう一度同じ手順でプッシュしてみる
・ユーザー名が違うかと思い、確認したが合っている
・ `git push -u origin --all` とコマンド入力してみる

◯参考にしたURL
http://pyoonn.hatenablog.com/entry/2014/10/29/191744
https://qiita.com/katsukii/items/c3df0653ac07d41fe03f

以上です。よろしくお願いいたします

=======

なにかわからないことがあったときに、このような形で質問されると、答える側も回答しやすいですね。

闇雲に、

「なんかエラーがでました。。」

と言われても、原因を究明するのに時間がかかってしまいますし。

## まずは現在がリモートリポジトリにどんなURLが登録されているかを確認

`Permission denied (publickey).`  となる場合、大抵はSSH接続が正しくできていないことが多いですね。

とりあえずは、一旦以下のコマンドを入力して、まずは、現在のリモートリポジトリの状況を確認してましょう。

```bash
$ git remote -v
```

すると、以下のような表示がされると思います。

```bash
$ git remote -v
origin  git@bitbucket.org:ec2-user/hello_app.git (fetch)
origin  git@bitbucket.org:ec2-user/hello_app.git (push)
```

ここからわかることは、とりあえずリモートリポジトリにはちゃんとURLが登録されていて、存在しているということです。


## エラーの原因は公開鍵と秘密鍵に不整合が起きているため

SSH接続は鍵という概念があって、公開鍵である `id_rsa.pub` を登録すると、pushする際に自分だけローカルに持っている秘密鍵と照合し、それぞれのユーザーを認識するような仕組みをとっています。

今回生徒さんからご質問いただいたエラーは、その公開用の鍵と秘密鍵の整合性があっていないのが原因ですね。

## sshディレクトリ配下のファイルを確認してみる

エラーの原因がわかったところで、解消に向けてコマンドを叩いていきましょう。

まずはターミナルで次のコマンドを実行します。

```bash
$ ls ~/.ssh
```

実行結果を確認してみてください。もし、表示が

```
authorized_keys  known_hosts
```

とだけになっていたら、あなたはまだ公開鍵と秘密鍵を作成していないことになります。

ということで、次のコマンドを使って、それぞれの鍵を作成しましょう。

```bash
$ ssh-keygen -t rsa -C "hoge@example.com"
```

すると、いろいろと聞かれるので、必要事項を入力します。

```bash
ec2-user:~/environment $ ssh-keygen -t rsa -C "hoge@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): hoge
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
Your identification has been saved in hoge.
Your public key has been saved in hoge.pub.
The key fingerprint is:
SHA256:/Wm/wQl1So7ugK1dPmbLwg3Bjg+hbr/knnhW+2Q6f3E hoge@example.com
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|         .    o .|
|        ..o  = o |
|       .S+..o o  |
|      . oo+o +..E|
|     .  o=o+O +o |
|      o+o+*@=... |
|     ..=B.oBB+o. |
+----[SHA256]-----+
```

|項目|意味|
|:--:|:--:|
|Enter file in which to save the key | 公開鍵のファイル名を入力。そのままEnterを押すと、`id_rsa` という名前になる。(すでにあった場合は、上書きしていいかと聞かれる)
|Enter passphrase (empty for no passphrase) | 秘密鍵用のパスワード。そのままEnterを押すと、パスワードなしになる。|
| Enter same passphrase again |  確認用なので秘密鍵用のパスワードを再入力

無事に作成できたら、下記のコマンドを実行しましょう。

```bash
$ cat ~/.ssh/id_rsa.pub 

```

すると、次のような暗号化された文字列が返ってきます。

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGIpyz/3d8VYW8lKsx46wQ4VmnnT318h867KemwKnfBknfRi9Xq9nFLexoLNJTdgFNlzUkls90UshG6C2QOZpEVgBCpeE9xhde3hnahFPoR8RltwrsyzX8CHrItK2ZmUOsrQjC/Sy4ZTEUZeLDK472FeuBElJ3ukPOG1hDeVaDS3bYJyKy1T+MSOX7tXfwcyQNDHzko+5luJWEVkciV1aoJ3vflAm3XKdrZ1q/eY+7wf8yThD6a1jWtqsPfP/2WZ3fbmBW7CX8XVzSDbO3DFmorZuwpXFGXOqd8nGFtZnbL3jOxuRsBosgkaTnD2/5ZjaPpZ7dO78XO1gziv2JXxGr hoge@example.com
```

これをコピーして、Bitbucketに登録します。

## Bitbucketに公開鍵を登録

Bitbucketにログインしたあと、以下のGif画像の手順にしたがって、SSH鍵を登録するページまで遷移してください。

![bitbucket-ssh.gif](https://qiita-image-store.s3.amazonaws.com/0/195539/10818462-145a-2237-3650-1970031a995b.gif)

先程コピーした公開鍵を `Key` の部分にはりつけてましょう。

`label` はわかりやすい名前であればなんでもOKです。

## pushしてみる

それでは、もう一度、pushしてみましょう！

```bash
$ git push -u origin master
```

エラーが発生せずにpushできたら完璧です！

お疲れ様でした！