質問: asp.net mvc5の環境化でサーバーにリクエストをしてきたクライアントブラウザのTLSバージョンを取得したいのですが可能でしょうか? SslStreamを使って行えるかと思いましたがHttpRequestBaseのRequest.InputStreamでは変換ができないようでした。 サーバー上で取得が難しければjavascriptでも可能でしょうか?
回答: TLSは各バージョンで使用できる暗号スイートが定義されています。 例えばIPAのSSL/TLS暗号設定ガイドラインでは「高セキュリティ型」「推奨セキュリティ型」「セキュリティ例外型」を定義していますが、この中の「高セキュリティ型」では > > 高セキュリティ型の暗号スイート設定では、TLS1.2 でのサポートが必須と指定されている暗 > > 号スイート AES128-SHA を利用した通信が接続不可となることに留意されたい > > > とTLS 1.2のみならず、TLS 1.2で必須と定められている暗号スイートすら使用しないことを推奨しています。 逆の例で、Windows XP / Vista上のInternet Explorerは一定の設定を行うとTLS 1.2まで有効化させることができます。ただし、使用可能な暗号スイートは限定的なため、TLS 1.2を使用していてもサーバー側の求める暗号スイートに対応しておらず接続できないことがあります。 というわけでTLSバージョンだけでなく、どの暗号スイートが利用可能かも含めて判断されることをお勧めします。 TLSでは最初にブラウザーからClientHelloを送信しますがその中にTLSバージョンやブラウザーが使用可能な暗号スイートの一覧が含まれています。その後、WebサーバーはServerHelloで受け入れた暗号スイートを返します。TLSのハンドシェイクが完了して初めてHTTPのリクエストが送信されるため、少なくともasp.netではTLSでどのようなやり取りが行われたかは確認することができません。 結局、htbさんがコメントされているような方法が有効かと思われます。つまり、質問者さんが将来的に受け入れ可能と考えているTLSバージョン・暗号スイートのみに限定したWebサーバーを別建てします。JavaScriptで当該Webサーバーに接続、リクエストが通れば、ブラウザーは条件を満たしている・通らなければ満たしていないと判断し、表示内容を切り替えるのはどうでしょうか。