SSHってなんだ？【前編】

# お知らせ
**なるべく誤りは修正していますが、この記事はバラック小屋のごとくつぎはぎだらけのものです。コメントにいただいた記事を読むことをおすすめします。**
DH法のイメージを掴みたい方のみ、1-2を中心にお読みください。

# はじめに

「よくわかってないんだよな〜」と思いつつ、避けてきた話題です。

先日Macを買ったのですが、SSHの再登録？をしなければいけません。

これを期に、学んでいこうと思います。

（前置きが長い上、結局一部分を理解できた気になるだけの記事です。）

# まずは公式ドキュメントを読む

[SSH について - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/about-ssh)

![スクリーンショット 2024-03-15 9.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/6f44af5c-bfd3-375f-10f7-2af726db5c61.png)


大きく書かれたこちら。２つのメリットがあるようですね。
- Githubへのアクセスのたびにtokenを入力しなくていい
- コミットに署名できる

あ、わかりやすそう。
文章も短いし・・・
<font color="LimeGreen">なんだ、簡単か？</font>

……と思っていた時期がありました……。


> SSH について詳しくは、Wikipedia の「[Secure Shell](https://en.wikipedia.org/wiki/Secure_Shell)」を参照してください。

**ヴッッ( ´ཫ` )**

それを知りたかったのに・・・
Wikipedia読んでもわからんし・・・ 

知識の検証ができない分野では使いたくなかったんですが仕方なし。
ChatGPTに聞いてみよう。

ChatGPTの返答は長かった&理解できない部分もあったので、記事の最後に載せておきます。
今回はそのうちの、「暗号化の確立方法（Diffe-Hellman鍵交換）」について書きます。
この点については信頼度が高いはず。他のソースも確認できたので。

https://qiita.com/okajima/items/036d7e751234f88fbe9a
# 接続開始と暗号化の確立

1. SSHクライアントからSSHサーバーへ、「接続したいよ！」と伝える
2. 鍵交換プロセス（Diffie-Hellman鍵交換）を行い、「共有鍵」を作成する

## 1-1. SSHクライアントからSSHサーバーへ、「接続したいよ！」と伝える

言葉そのままではあるのですが、少し詳細に見てみましょう。

まず、接続リクエストを行います。このときのポート（SSHポート）は、ポート22であることが一般的なようです。

その後、SSHプロトコルのバージョンを交換します。「お前は原始人じゃないな、同じレベルで会話できるな」と確認しているわけですね。

## 1-2. 鍵交換プロセス（Diffie-Hellman鍵交換）を行い、「共有鍵」を作成する

さて、ここからが本題です。

「Diffie-Hellman鍵交換」なるものが出てきていますね。

「それぞれが自身の秘密鍵と公開パラメータを組み合わせ、交換することで安全に共通鍵を作成できる方法」らしいのですが、これで理解できたら苦労はない。

ということで、絵の具に例えましょう。

自分（SSHクライアント）と、相手（SSHサーバー）がいます。

1. お互いが「秘密絵の具」を選びます。何を選んだかは絶対に共有しません。
   自分が「青」、相手が「赤」を選んだとしましょう。

2. 「公開絵の具」を１つ決めます。
   今回は「黄色」にしましょう。

3. 「公開絵の具」と「秘密絵の具」を混ぜます。
   自分は「青」+「黄」、相手は「赤」+「黄」ですね。

4. 混ぜた色を交換します。
   自分から相手に、「青」+「黄」を渡し、相手から自分に「赤」+「黄」が渡されます。

5. 互いが受け取った色に、自分の「秘密絵の具」を混ぜます。 
   自分は (「赤」+「黄」) +「青」、相手は (「青」+「黄」) + 「赤」になります。
   
<font color="LimeGreen">つまり、同じ色が互いの手元に作られたわけです！</font>

この手法の美しい点は、「秘密絵の具」を秘密にしたまま、「公開してもいい絵の具」を交換しただけで互いの手元に同じものが作られる点です。

今回は絵の具で例えたため、「公開された色」と「公開絵の具」から「秘密絵の具」を推測できるように見えますが、
実際は「公開ステータス（公開された色）」と「共有秘密（公開絵の具）」から逆算・推測が不可能なmod計算を行います。

おさらいです。
Diffie-Hellman鍵交換とは、「それぞれが自身の秘密鍵と公開パラメータを組み合わせ、交換することで安全に共通鍵を作成できる方法」

# おわりに

まとまりのない、中途半端な記事になってしまいましたが、一旦はここまで。
途中まで書いていたものを切り離したりしたので、文章が変だったら指摘していただけると幸いです。

`git clone`のSSH版は何をやっているのかとか、GithubにSSHキーを登録するのは何を意味するのかとかは知りたいので、引き続き調べていきます。

以下、ChatGPTの返答です。
  
> SSH（Secure Shell）は、ネットワーク経由で別のコンピュータに安全にログインしたり、コマンドを実行したり、ファイルを転送したりするためのプロトコルです。SSHの仕組みを理解するには、暗号化、認証、セッション管理という3つの主要なステップを理解する必要があります。ここでは、具体的な文字列「xxx」を使用して、SSHの接続プロセスを説明します。
> 
> ### 1. 接続開始と暗号化の確立
> 
> 1. **クライアントがサーバーに接続を試みる**: SSHクライアント（例: ユーザーのコンピュータ）がSSHサーバー（リモートコンピュータ）に接続を試みます。
>     
> 2. **鍵交換**: サーバーとクライアントは、セキュアな通信チャネルを確立するために鍵交換プロセス（Diffie-Hellman鍵交換）を行います。このプロセスを通じて、双方は共有秘密（共有鍵）を生成しますが、この鍵は途中で傍受されても元の値を推測することは非常に困難です。
>     
> 3. **暗号化の確立**: 共有秘密を元に、双方は通信の暗号化に使用するセッション鍵を生成します。この段階から、クライアントとサーバー間の通信はすべて暗号化されます。
>     
> 
> ### 2. 認証
> 
> 1. **サーバーの認証**: クライアントは最初にサーバーの公開鍵を用いて、接続しているのが正しいサーバーであることを確認します。この段階で、「xxx」という具体的な文字列がサーバーの公開鍵と関連付けられているとします。クライアントは以前に保存したサーバーの公開鍵（または信頼できる第三者から得た鍵）と比較することで、サーバーの身元を確認します。
>     
> 2. **ユーザーの認証**: 次に、クライアントはサーバーに対して自身の身元を証明する必要があります。これは通常、パスワード認証や公開鍵認証（より安全）を使用して行われます。公開鍵認証の場合、クライアントは自分の秘密鍵を使用して「xxx」という文字列に基づく署名を生成し、サーバーに送信します。サーバーは、対応する公開鍵を使用して署名を検証し、正当性を確認します。
>     
> 
> ### 3. セッション管理
> 
> 認証が成功すると、クライアントとサーバー間のセキュアな通信セッションが確立されます。このセッション内で、クライアントはリモートシェルを開始したり、コマンドを実行したり、ファイルを転送したりすることができます。すべてのデータは、セッション鍵で暗号化された状態で転送されます。
> 
> ### 結論
> 
> SSHは、Diffie-Hellman鍵交換による暗号化の確立、公開鍵に基づく相互認証、およびセキュアなセッション管理を通じて、安全なリモートアクセスを提供します。「xxx」という具体的な文字列を使用する例は、公開鍵認証のプロセスを具体化するためのものであり、実際には秘密鍵による署名や鍵の検証に関連するデータがこの役割を果たします。