サーバーは使用する TLS のバージョンをどのように決定するのでしょうか?

サーバーは使用する TLS のバージョンをどのように決定するのでしょうか?

クライアントとサーバーの間で交渉が行われることは理解していますが、サーバhttps リクエストに応答するときに使用する TLS バージョンを選択しますか? たとえば、接続を TLS の最小バージョンに制限するにはどうすればよいでしょうか? また、サーバーが使用するセキュリティ証明書と、サーバーが使用する TLS のバージョンとの間には関係がありますか? AWS ドキュメントをいくつか読んでいたところ、このことが示唆されているようでした。

まったくの初心者です。質問の仕方が間違っていたらごめんなさい。回答として、読んでいただけるリンクを貼っていただいても構いません。

答え1

しかし、サーバーが https リクエストに応答するときに使用する TLS バージョンを選択する方法は何によって決まるのでしょうか?

TLS ハンドシェイクでは、クライアントはサーバーに対して、実行できる最良のバージョンを通知します。サーバーがクライアントのバージョンと同等かそれ以下のプロトコル バージョンをサポートしている場合、サーバーはそれらの中で最良のバージョンで応答します。サーバーがそれらのいずれもサポートしていない場合、ハンドシェイクは失敗します。サーバーがクライアントでサポートされていないバージョンで応答した場合も、ハンドシェイクは失敗します。

また、サーバーが使用するセキュリティ証明書と、サーバーが使用する TLS のバージョンとの間には関係がありますか?

TLS プロトコルのバージョンと使用される証明書の間にはほとんど関係がありません。廃止された SSLv3 と TLS 1.x バージョンのプロトコルの間には、TLS 1.x のみが拡張機能をサポートしているという点でわずかな違いがあります。重要な拡張機能はserver_name(SNI - サーバー名表示) で、クライアントはアクセスしたいドメインを指定します。同じ IP アドレスに複数の証明書がある場合、サーバーは適切な証明書を選択できます。

答え2

私は TLS プロトコルのハンドシェイクネゴシエーションの専門家ではないので、ここでは「大まかな」回答をします (専門家の皆さん、間違っていたら訂正してください) * ここでは TLS バージョンについてのみ話しています。暗号については話していません。

シナリオ 1: クライアントは、可能な限り最新バージョンの TLS を試します。クライアントが 1.1 (旧) と 1.2 をサポートしているとします。すると、サーバーは可能な限り最新バージョンを使用して接続します。1.2 になることを期待します。

シナリオ 2: クライアントは 1.2 以降をサポートしており、サーバーは 1.1 しか認識しない古くて更新されていないマシンです。

シナリオ 3: 2 と同じですが、逆になります。接続も機能しません。

クライアントは接続をネゴシエートできません。そこで停止します。

シナリオ 4: クライアントはサーバーと同様にバージョン 1.1 と 1.2 をサポートしていますが、サーバー管理者 (Apache HTTPD など) が 1.2 のみを使用して接続を強制するように構成した場合、クライアントは 1.2 を使用します。

また、TLS 1.3 もありますが.... 同じ考え方になります。(アイデア)

関連情報