web-dev-qa-db-ja.com

TLS接続のどこで、サーバーから送信されたコンテンツの署名を取得できますか?

HTTPSサーバーから返された特定のコンテンツが実際に提供されたことを証明できるようにしたいと思います。

TLSプロトコル全体を調べたところ、ServerKeyExchangeを使用して、サーバーに送信できるランダムな文字列のサーバーの署名を取得できることがわかりました。 Diffie-Hellman交換を開始するため。

しかし、私はサーバーが提供しているコンテンツのサーバーの署名を取得するする方法を見つけられませんでした。

そうする方法はありますか?

5
Luis Cuende

TLSでは、クライアントもサーバーもコンテンツに署名しません。最初のハンドシェイクで使用される暗号化署名は、次の目的で使用されますauthentication:クライアントは、適切なサーバーと通信するという保証を取得し、(クライアント証明書が使用されている場合)サーバーは、適切なクライアントと話します。ただし、これらの保証はどちらも譲渡できません。クライアントは、取得するデータがサーバーからのものであることを認識していますが、表示される可能性のある証明を取得しません。第三者に。これは認証であり、否認防止ではありません。

クライアントが接続全体に関連するすべて(送受信されたすべてのデータバイト、すべてのネゴシエートされた暗号化キーなど)を記録したとしても、これは1つのことだけを証明します。つまり、不特定の時点で、サーバーは確かに、TLSサーバーであり、少なくとも1つのTLS接続に関与しています。サーバーによって送受信されたとされるすべてのデータを含む他のすべてのものは、後で作成された可能性があるため、(暗号化の意味で)証明することはできません。

したがって、この署名が存在しないという理由で、「サーバーが提供しているコンテンツのサーバーの署名を取得する」方法が見つかりませんでした。サーバーに署名させたい場合は、これをプロトコルレベルで配置する必要がありますTLSトンネル内:サーバーにデータに適切に署名して送信させますTLSが「アプリケーションデータ」と呼ぶものの一部としての署名。もちろん、サーバーは操作を認識する必要があり、これは通常のTLS(HTTPS)処理の一部ではありません。

または、執行吏または同様の職員にサーバーに接続させ、データを取得して自分で署名することにより、サーバーが実際にこれらのデータコンテンツを提供することを(合法的に)保証します。

9
Thomas Pornin

RFC4346

TLSプロトコルの目標は、優先度の高い順に次のとおりです。
以下:

  1. 暗号化セキュリティ:TLSを使用して、2者間の安全な接続を確立する必要があります。

  2. 相互運用性:独立したプログラマーは、TLSを利用して、互いのコードを知らなくても暗号化パラメーターを正常に交換できるアプリケーションを開発できる必要があります。

サーバーもクライアントも、それ自体でデータに署名することはありません。特定のスイートとのハンドシェイクの一部にのみ署名します。つまり、特定のサーバーとのハンドシェイクが発生したこと、およびそのハンドシェイクで交換されたデータをサードパーティに証明できます。

また、 ここ から、次のように読むことができます。

標準TLSには、否認防止のサポートはありません。

2
user45139