46916
asp.net mvc5の環境化でサーバーにリクエストをしてきたクライアントブラウザのTLSバージョンを取得したいのですが可能でしょうか？  
SslStreamを使って行えるかと思いましたがHttpRequestBaseのRequest.InputStreamでは変換ができないようでした。  
サーバー上で取得が難しければjavascriptでも可能でしょうか？
CC BY-SA 4.0
2018-07-23T14:03:26.160
46875
2018-07-24T13:59:24.880
29429
question
javascript c# asp.net ssl
ブラウザのTLS/SSLのバージョン取得
TLSは各バージョンで使用できる[暗号スイート](https://ja.wikipedia.org/wiki/Transport_Layer_Security#%E6%9A%97%E5%8F%B7%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%88)が定義されています。  
例えばIPAの[SSL/TLS暗号設定ガイドライン](https://www.ipa.go.jp/security/ipg/documents/ipa-
cryptrec-
gl-3001-2.0.pdf)では「高セキュリティ型」「推奨セキュリティ型」「セキュリティ例外型」を定義していますが、この中の「高セキュリティ型」では

> 高セキュリティ型の暗号スイート設定では、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サーバーに接続、リクエストが通れば、ブラウザーは条件を満たしている・通らなければ満たしていないと判断し、表示内容を切り替えるのはどうでしょうか。
CC BY-SA 4.0
2018-07-24T13:59:24.880
46916
2018-07-24T13:59:24.880
4236
46875
answer