新PCでGitHubなどにSSH鍵を楽々追加するTips

# 導入
エンジニアの皆様には、数年に一度は新しいPCを購入して、そこに開発環境を新しく構築するといった機会が多々あるものと存じます。

この度にいつものソフトウェアのインストール・設定を手動で行うのは面倒です。そして、この煩わしさを解決するために、dotfilesリポジトリなどでこれらを管理しているといった方も多いのではないでしょうか。

しかしながら、そういった意識の高い方でもSSH鍵登録はその例外としており、都度GitHubのドキュメント等を参照しながら手動で登録している方が多いと認識しています。

本記事ではこの、新PCにおいてGitHubなどのGitホスティングサービスへのSSH鍵登録が面倒という問題を、スクリプティングで解決する方法について紹介していきます。特にGitHubとBitBucketの場合について触れます。

:::note alert
当記事に出現するスクリプトやコマンドを利用する場合には、セキュリティ上の懸念事項等を把握したうえで、**自己責任**でご利用なさってください。

仮に、「適当に実行したら既存ファイルを上書きされてしまった〜:cry:」等の問題が起こっても、筆者が一切の責任をとらないことに同意したものとみなします。

また、注釈の方も適宜ご参照ください。
:::


# GitHubの場合
GitHubは流石に業界トップということもあり、ghという便利なCLIコマンドがあります。
```bash:ghのインストール（macOSの場合）
brew install gh
gh auth login
```

こちらのコマンドで`gh ssh-key add`することにより、簡単にSSH鍵登録することができます。
- 公式ドキュメント：https://cli.github.com/manual/gh_ssh-key

```bash:例
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
gh ssh-key add ~/.ssh/id_ed25519.pub --title "{ラベル（例：PC機種名）}"
ssh-add ~/.ssh/id_ed25519
ssh -T git@github.com
```

そして、上記の内容を個人のdotfilesリポジトリかGistにまとめれば、自動化完了です！

なお、訳あってghコマンドをインストールできないような環境の場合、代わりにSSH鍵登録画面のURLをopenコマンドによって自動で開くことで、手動登録の負担を軽減するといったことが考えられます。
```bash:ghコマンドをインストールできない環境
open https://github.com/settings/ssh/new
```

# BitBucketの場合
「GitHubしか使ってないよ〜」という方だったら上記で終わりですが、私はBitBucketも使っているので[^1]、こちらに関しても記述します。
[^1]:GitHubのプライベートリポジトリが無料開放される前から秘匿性の高い開発を行っている場合、BitBucketが人気だったりします。私も研究の用途のみでBitBucketを利用しています。

BitBucketにはSSH鍵登録可能なCLIコマンドは用意されていませんが、幸いAPIを使って登録することができます。
該当エンドポイントは`https://api.bitbucket.org/2.0/users/{your_user_name}/ssh-keys`です。

このAPIを使うためには、初回だけはBitBucketのサイトからアプリパスワード（app password）の作成を行う必要があります。
- アプリパスワード登録画面：https://bitbucket.org/account/settings/app-passwords/
- 公式ドキュメント：https://support.atlassian.com/ja/bitbucket-cloud/docs/create-an-app-password/

作成するアプリパスワードには、アカウントという権限項目を全て与える必要があります。
![スクリーンショット 2024-12-09 11.27.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953411/df7d5635-b913-1703-c5c8-19d1afec4008.png)
![スクリーンショット 2024-12-09 11.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953411/0bace1e7-6ab9-d9a5-a916-88ca8ba9f771.png)



そして、作成したアプリパスワードとAPIを用いることで、次のようにしてSSH鍵を登録することができます。
```bash:例
curl -X POST -u "{アカウント名}:{アプリパスワード}" -H "Content-Type: application/json" -d "{\"key\": \"{id_ed25519.pubの中身}\", \"label\": \"{ラベル（例：PC機種名）}\"}" https://api.bitbucket.org/2.0/users/your_user_name/ssh-keys
```

次のGistには、SSH鍵の生成・上記APIでの登録・SSHエージェント登録といった一連の作業をスクリプト化してあります。
スクリプト化のポイントとしては、`read -s PASSPHRASE < /dev/tty`でSSH鍵作成時のパスフレーズを対話的に入力させるところにあります。[^2]
[^2]:GitHubの場合をスクリプト化する際にも、このテクニックを利用することができる。

https://gist.github.com/moatom/3d76f5f5eb6807fc564176be7ee3b945

冒頭のコメントにもあるように、curlでダウンロードした当スクリプトをbashにパイプすることで、こちらのスクリプトをワンライナーで実行することができます。[^3]
[^3]:個人のGistに移してから、お好みでカスタマイズしてから利用することを推奨します。このURLで当スクリプトを公開し続けることは保証しておりません。

```bash:上記Gistを実行するワンライナー
curl -LsSf https://gist.githubusercontent.com/moatom/3d76f5f5eb6807fc564176be7ee3b945/raw/a4e98f08210cd53377e87f178913c66fd0f50f17/bitbucket_ssh_key.sh | bash -s -- <username> <email> <app_password> <ssh_key_label (e.g. device name)>
```

注意点として、こちらのAPIを使う際には新PCで複雑なアプリパスワードを思い出して入力する必要があります。
そのために、アプリパスワードをBitwardenやGoogle Chromeのパスワードマネージャなどに登録しておき、新PCでも参照できるようにしておくとよいでしょう。

# 結論
## まとめ
本記事では、新しく購入したPCでGitホスティングサービスへのSSH鍵登録をするのが面倒という問題を、スクリプティングによる自動化で解決する方法について紹介しました。

特にGitHubとBitBucketという2つの有名なサービスに関して取り上げ、前者ではCLIコマンドのgh、後者ではAPIを利用することで、自動化できることを示しました。

このような自動化によって特定のデバイス上の特定の開発環境へ依存しない開発体制を整えておくことは、健全で生産的なソフトウェアエンジニアリングを長期間継続していくうえで重要です。

## 今後の課題
今後の課題としては、上記2つ以外のサービスに対しても鍵登録を自動化するということが挙げられます。実際、GitLabというサービスでもBitBucketと同様なAPIエンドポイントが公開されており[^4]、同じアプローチを用いることができるものと考えられます。
[^4]:https://docs.gitlab.com/ee/api/deploy_keys.html#add-deploy-key

また、本記事で示したGitHubの場合は完全にスクリプト化したものを用意していないため、こちらを用意することも重要です。