Wiresharkを使用して、SQL Serverを実行している同じLAN上のクライアントワークステーションと別のワークステーション間のデータの暗号化で使用されているSSL/TLSのバージョンを特定しようとしています。この件に関するドキュメントでは、ServerHelloおよびClientHelloメッセージを確認することをお勧めしていますが、Wiresharkメッセージフィードにそのようなメッセージが表示されません。私はこの表示フィルターを使用しています:
tcp.len> 1 && tcp.port == 1433
データの暗号化が行われていること、および上記のフィルターを使用して表示されたパケットが、調べたいSQL Serverデータ転送に関連していることを確認できます。 Wiresharkメッセージフィードは次のようになります。
編集:
以下は、データベース接続を呼び出し、「フォロー」->「TCPストリーム」を選択した後の4番目のパケットのパケット詳細ペインです。
これは、Microsoft Message Analyzerを使用して分析したときに表示されます。 TLSの詳細ペインは、Client Helloパケット用です。
(確実なはずの新しい回答を追加します。ここに到達した方法のデバッグに役立つので、古いものを残します。コメントで実際の回答を指すことのクレジットは、@ P4cK3tHuNt3Rと@ dave_thompson_085に送られます)
Wiresharkを使用して、SQL Serverを実行している同じLAN上のクライアントワークステーションと別のワークステーションとの間のデータの暗号化で使用されているSSL/TLSのバージョンを特定しようとしています。
MS-TDS ( "Tabular Data Stream Protocol")を使用する接続を表示しています:
...the Tabular Data Stream Protocol, which facilitates interaction with
a database server and provides for authentication and channel encryption
negotiation; specification of requests in SQL (including Bulk Insert);
invocation of a stored procedure, also known as a Remote Procedure Call
(RPC); returning of data; and Transaction Manager Requests. It is an
application layer request/response protocol.
TDS protocol documentatio nを表示すると、SSLパケットがTDSラッパー内にカプセル化されることが指定されています。
A TLS/SSL negotiation packet is a PRELOGIN (0x12) packet header encapsulated
with TLS/SSL payload.
投稿したMicrosoft Message Analyzerのスクリーンキャップで、TDSヘッダー(赤で囲んだ、0x12で始まる)に続いて、数バイト後にTLS CLIENT_HELLOパケット(青で囲んだ、0x16 0x03 0x03で始まる)が続きます。
0x16
は、TLSの「ハンドシェイク」ヘッダーインジケーターです。0x03 0x03
はTLSバージョンです(TLS 1.2は RFC 5246 に従います):
使用されているプロトコルのバージョン。このドキュメントでは、バージョン{3、3}を使用するTLSバージョン1.2について説明します。バージョン値3.3はTLS 1.0の{3、1}の使用から派生した歴史的なものです。
そのため、「SSL/TLSのバージョンを確認する」という質問に対する単純な答えは「TLS 1.2」です。
さて、WiresharkがエンコードされたTLSでTDSパケットを適切に解析できるかどうかに関するさまざまなレポートを見てきました。答えはあなたが始めたものだと思います-それはTLSが存在することを通知しますが、ネイティブTLSセッションの場合のように詳細を解析しません。
このStackOverflowの質問 のとおり、Microsoft Network Monitorは両方のレベルのカプセル化を解析できるようです。その中のコメントには、 Microsoft Message Analyzer がそのツールと同等の新しいものであると記載されています。
(この回答は無視します。これは履歴データのために残します。実際に何が起こっているのかを説明する他の回答を読んでください)
質問にサンプルパケットが追加された後に更新-
あなたが提供したパケットは明らかにTLSパケットではありません。指定した16進数を見ると、TCPデータの最初の3つのオクテットは12 01 00
ですが、TLSパケットの場合、最初の3バイトは16 03 0X
である必要があります。ここで、0x16はTLS「ハンドシェイク」レコードタイプを意味し、0x03はSSLv3/TLSv1。*を意味し、0x0XはTLSバージョンを示します-TLS 1.0の場合は0x01、TLS 1.1の場合は0x02、TLS 1.2の場合は0x03。
さらに、パケットにクリアテキストの「sqlexpress2012」文字列があり、これがTLSクライアントHelloの場合は存在しません。
(どのように12 01 00
がデータの始まりであると判断しましたか?パケットの最初の14バイトはイーサネットヘッダーです。次の20バイトはIPヘッダーです。TCPヘッダーは0x50であり、そのバイトの最初のニブルに4を掛けたものがTCPヘッダーの長さなので、5 * 4 = 20です。したがって、実際のデータの最初のバイトは54バイトで始まります。 12 01 00 6c 00 00 ...
)
したがって、WiresharkがこれをTLSとして表示しない場合、それはそうではないためです。サーバー構成を再確認する必要があります。
元の答え:
これらのパケットは標準のTLSポート(443など)上にないため、WiresharkにそれらをTLSパケットとして解釈するように指示する必要があります。デフォルトでは、ポート1433はTLSがあると解釈されません。 TDSのデフォルトは暗号化されていません。したがって、Wireshark自体はTLSとして解析しません。
これを変更するには、パケットの1つを右クリックし、[名前を付けてデコード]を選択します。ポートの「値」が1433に設定されていることを確認してから、「現在」をSSLに設定します。
[OK]をクリックすると、パケットに戻ると、パケットがより詳細に解釈されていることがわかります。
最後に、いずれかのパケットの詳細ペインを見ると(プロトコルが調整されている場合は、クライアントhelloではなく、サーバーhelloを使用することをお勧めします)、TLSバージョンが非常に明確に表示されます。
Wiresharkでこのフィルターを使用して、TLS 1.0トラフィックを検索します。
ssl.handshake.version==0x0301
0x0302
はTLS 1.1であり、0x0303
はTLS 1.2です。