ECH (Encrypted Client Hello:暗号化されたクライアントハロー) は TLS 1.3 のドラフト拡張であり、クライアントが TLS ハンドシェイクで client_hello を暗号化して、通常の TLS ハンドシェイク中に平文で送信される機密メタデータの漏洩を防止できるようにします。 ECH は当初 ESNI (Encrypted Server Name Indication) として提案されました。ESNIの提案の理由としては、サーバー名表示がハンドシェイク中に受動的な観察者にも見える機密フィールドの 1 つであるためでした。その後、ESNIはClientHelloパケット全体を暗号化するので、ECHと名前が変更されました。 ECH は HPKE (Hybrid Public Key Encryption) を使用して共有シークレットを取得し、client_hello を暗号化します。
ECH は、内側の Client Hello と外側の Client Hello を作成することによって機能します。 外側の hello からはすべての機密メタデータが削除され、代わりにECH と呼ばれる新しい TLS 拡張が含まれています。 内側の hello にはすべての機密情報が含まれており、HPKE を使用して暗号化された後、ECH 拡張として外側の hello に配置されます。 クライアントは外部の hello を送信し、サーバーは ECH の使用を検出し、HPKE キーを使用して内部の hello を復号します。
ECH の使用例を次に示します:
https://gist.github.com/jpbland1/ad46617fcc40934b252ce031c7aa5969
この例では、さまざまな TLS とセキュリティ設定をテストするようにセットアップされた Cloudflare サーバーに接続し、`wolfSSL_GetEchConfigs` を呼び出して `retry_configs` を取得します。 次に、新しい SSL オブジェクトを作成し、`wolfSSL_SetEchConfigs` を呼び出して 取得した`retry_configs`を適用し、ECH を使用して接続します。 この接続と再接続のプロセスを実行して、設定された ECH がない場合に送信される GREASE ECH またはダミー ECH と呼ばれるものを送信することにより、`retry_configs`を取得します。 Web サイトの DNS レコードから ECH 構成を取得する場合は、この手順をスキップできますが、DNS はこの例の範囲外です。 ECH 構成を設定したら、通常のように ssl 接続を使用できます。ここで、http 要求を `/cdn-cgi/trace/ HTTP/1.1\r\n` に送信します。出力される応答には”sni=encrypted”と表示されます。これは、ECH が機能していることを意味します。
ECH のサポートはこのPullRequestとしてオープンされています: https://github.com/wolfSSL/wolfssl/pull/5623
原文:https://www.wolfssl.com/encrypted-client-hello-ech-now-supported-wolfssl/