私が知っているように、SSLでクライアントとサーバー間で確立する最初の通信プロトコルはハンドシェイクプロトコルであり、 this サイトが言うように:
SSLレコードプロトコルは、セッション内のすべてのデータを転送するために使用されます-メッセージと他のSSLプロトコル(たとえば、ハンドシェイクプロトコル)の両方...
私の質問は、最初の通信プロトコル(ハンドシェイクプロトコルの前)でさえある前に、レコードプロトコルがクライアントとサーバー間のデータをどのように暗号化するかです。
たとえば、レコードプロトコルは暗号化にどのキーを使用し、どのようにこのキーをクライアントと共有しますか?
From RFC 8446、Section 5 (TLS 1.3、Record Protocol):
TLSレコードプロトコルは、メッセージを送信して、データを管理可能なブロックに断片化し、レコードを保護して、結果を送信します。受信したデータは検証、復号化、再構成され、上位のクライアントに配信されます。
レコードレイヤーでフラグメントを暗号化するための暗号は、時間とともに変化する可能性があります。鍵が確立されていないため、最初は null cipher が使用されます。これは事実上、暗号化が適用されないことを意味し、「暗号文」は元のフラグメントと同じです。
ハンドシェイクプロトコル(レコードレイヤーで実行)は、最初にこのnull暗号の使用を開始します。クライアントとサーバーがセキュリティパラメータを共有した後(Client HelloとServer Helloハンドシェイクメッセージを使用)、キー交換の実行を開始して共有シークレットを確立できます。これに続いて、共有シークレットに基づいてレコードレイヤーをより安全な暗号に切り替えることができます。 TLS 1.2以前では、この切り替えはChange Cipher Specメッセージを使用して開始されます。
SSL/TLSには少し歴史があります。非対称暗号化に基づく鍵交換には2つのタイプがあります。 1つはRSA暗号化に基づいており、もう1つはDiffie-Hellman(DH)に基づいています。 TLS 1.3では、DH鍵交換メカニズムのみが残っています。
RSAキー交換では、クライアントはランダムな プリマスターシークレット を生成し、サーバーから提供された証明書のRSA公開キーを使用して暗号化し、結果をサーバーに送信します。サーバーは、対応する秘密RSAキーを使用して結果を復号化できるため、同じプリマスターシークレットを取得します。
Diffie-Hellman鍵交換の場合、両方の当事者が新しい鍵のペア(秘密鍵と対応する公開鍵)を生成し、公開鍵を互いに共有します。独自の秘密鍵とピアの公開鍵を 特別な方法 で組み合わせることにより、同じ共有秘密を取得します。
どちらの場合も、対称鍵に変換される共有秘密が取得されます。このキーは、レコードレイヤーでフラグメントを暗号化するために使用されます。
TLSのより拡張された扱いについては、 SSL/TLSの仕組み を参照してください。