【図解】https(ssl/tls)の仕組みとシーケンス,パケット構造 〜暗号化の範囲, Encrypted Alert, ヘッダやレイヤについて~

https とは? http との使い分けは?

https とは、簡単に言うと http プロトコルを暗号化したものです。

http プロトコルはインターネット等のIPネットワーク上にある Web サーバから html ファイル等のファイルをダウンロードしたり、サイトへログインする際のID・パスワード情報を送ったりするのに使う通信プロトコルです。

ですが、IDパスワードをそのまま送ってしまうと、万が一誰かに通信を傍受(パケットキャプチャ)されていたらパスワードが漏れ、そのサイトへ不正なログインをされてしまいます。楽天等のショッピングサイトだったら勝手に買い物をされてしまう可能性もあります。

そのような事態を防ぐため、通常のショッピングサイトはほぼ 100%、https による暗号化を行っています。最近は無料のデジタル証明書が増えてきており、ショッピングサイトでない普通のサイトも全て https による暗号化が為されており、むしろ http のサイトを探す方が難しくなってきています。

厳密には、暗号化以外にもサーバの認証を行っています。つまり、そのサイトが本当に正しいサイトなのか ( DNS キャッシュポイズニング攻撃等により、悪意あるサイトへ誘導されていないか ) を確認することができます。

認証に失敗するとどうなるかについては下記ページ等をご参照ください。

SSLエラー/セキュリティ証明書のエラー警告が表示される理由・原因と対処
SSLエラー/セキュリティ証明書のエラー警告が表示される理由・原因と対処
セキュリティ証明書(デジタル証明書やSSL証明書、サーバ証明書などとも呼ばれます...

https のシーケンス図

httpのシーケンス図とhttps のシーケンス図を比べてみます。

『TCP 3way ハンドシェイク』と『暗号化対象のhttp通信』の間に、TLSセッション開始のためのネゴシエーションが入っています。

このネゴシエーションのときに、暗号化のためのパラメータをやり取りします。具体的には以下を実施しています。

  1. 暗号化方式の対応リストを互いに提示し、ベストな方式を決定
  2. Certificate によるサーバからクライアントへデジタル証明書の送付
  3. Client/Server Key Exchange (TLS1.3はkey_share)による暗号化用共通鍵生成

1. については Client Hello にてクライアント側が対応している暗号化スイートのリストを提示し、Server Hello によりその中でサーバ側が採択したものをクライアントへ提示します。

2. については Certificate メッセージにて『デジタル証明書の署名によるサーバの認証』が行われます。

そして最後の 3. については Client/Server Key Exchange (TLS v1.3 以降は key_share Extension) により Diffie-Hellman アルゴリズムによる共通鍵を生成します。(以前はデジタル証明書の公開鍵を使ってクライアントから共通鍵の素を提示していましたが、前方秘匿性が無いため、最近は DHE や ECDHE を使うのが主流です。そしてTLS v1.3においては公開鍵による共通鍵の素の提示は禁止されました)

公開鍵・秘密鍵については以下を参照下さい。

【図解】初心者も分かる"公開鍵/秘密鍵"の仕組み~公開鍵暗号方式の身近で具体的な利用例やメリット〜
【図解】初心者も分かる"公開鍵/秘密鍵"の仕組み~公開鍵暗号方式の身近で具体的な利用例やメリット〜
公開鍵・秘密鍵でできること ~暗号化とデジタル署名~ 特定のサーバAが秘密鍵を持...

なお、2018年8月に公開された TLS v1.3 の v1.2 からの変更点などについては以下を参照してください。

【図解】TLSv1.3の仕組みとシーケンス ~QUICに向けた0-RTT, key_shareやHelloRetryRequest, NewSessionTicketとPSKの関係, コネクションとセッションの違い~
【図解】TLSv1.3の仕組みとシーケンス ~QUICに向けた0-RTT, key_shareやHelloRetryRequest, NewSessionTicketとPSKの関係, コネクションとセッションの違い~
TLS バージョン 1.3 の概要、1.2 との違い 2018年8月に TLS ...

https 通信であっても盗み見される情報

https 通信であっても、(宛先IPアドレスは当然のことながら、)通信先に関して以下の情報を盗み見される可能性があります。

CONNECTメソッドのホスト情報

CONNECT とは、クライアントがプロキシ経由で https 通信をするときに使われる http メソッドです。一般的な http 通信においては GET メソッドが使われますが、https がプロキシ経由で通信する際、例えば https://www.yahoo.co.jp と通信するクライアントは、プロキシに対して "CONNECT www.yahoo.co.jp" というメソッドを平文で発行しますので、これを盗み見すれば宛先情報が分かります。

デジタル証明書の Common Name (CN)情報

https のセッション開始時(暗号化通信が始まる前)の "Certificate" メッセージではサーバがデジタル証明書を提示しますが、そのデジタル証明書には Common Name (CN) というURLのホスト情報が含まれています。これを盗み見することでやはり宛先情報が分かります。

この情報はよく UTM の URLフィルタでのサイトカテゴリ判別で使われたりします。

https の URLフィルタ(Web/コンテンツフィルタ)の動作と仕組み,SNI検査,製品例について
https の URLフィルタ(Web/コンテンツフィルタ)の動作と仕組み,SNI検査,製品例について
URLフィルタ(Webフィルタ/コンテンツフィルタ)とは URLフィルタとは、社...

Client Hello の ServerName Extension

2011年に公開された RFC 6066 においては "Server Name" という Extension が定義されており、TLSコネクション開始時の "Client Hello" メッセージの中に含めることができます。

この Extension には通信先サーバの URL 情報が載せられています。中間のNW機器等が宛先を認識して制御しやすくするためです。

この情報もデジタル証明書のCNと同様、UTM の URL フィルタで使われます。

https のパケット構造、ヘッダ、フォーマット

https のフレームフォーマットは以下のようになります。

TLS通信は『レコードヘッダ』と『ペイロード』に分かれています。

レコードヘッダの Version は『SSL2.0 = 0x0200』,『SSL3.0 = 0x0300』,『TLS1.0 = 0x0301』,『TLS1.1 = 0x0302』,『TLS 1.2 = 0x0303』,『TLS1.3 = 0x0304』となっています。

Length には TLS ペイロードの長さ(MAC: Message Authentication Codeを含む) を示す値が入ります。

そしてContent Type は『ペイロードにどのようなデータが入っているか』を示しています。

Content Type:20 = ChangeCipherSpec

ハンドシェイクプロトコルのサブプロトコル。暗号化通信の準備が整ったことを相手に知らせるメッセージです。

Content Type:21 = Alert

ハンドシェイクプロトコルのサブプロトコル。相手に何かしらの警告を通知するメッセージです。これはさらに Alert Type に分類されます。(次章参照)

Content Type:22 = Handshake

ハンドシェイクプロトコルのサブプロトコル。これはさらに Handshake Type に分類されます。(上図参照)

Content Type:23 = Application Data

http や smtp、ldap 等の上位プロトコルが暗号化されて通信されます。

Wireshark で Encrypted Alert および Unknown Record が表示されるケースについて

パケットキャプチャ時に Encrypted Alert と表示される場合があります。これは”Content Type:21 = Alert”によるものです。このパケットが出る理由はまちまちですが、TCP FIN の直前にある場合は大抵、TLS コネクションの終了を意味する『close_notify』だと思われます(暗号化されていて見えない)。

Alert と付くので少し気持ち悪いですが、正常終了でもこの『close_notify』が使われます。

TLS v1.2 を規格化している RFC 5246 の Section 7.2 では、以下の種類の Alert Type が定義されています。カッコの中の数字が Alert Type番号です。

close_notify(0), unexpected_message(10), bad_record_mac(20), decryption_failed_RESERVED(21), record_overflow(22), decompression_failure(30),
handshake_failure(40), no_certificate_RESERVED(41), bad_certificate(42), unsupported_certificate(43), certificate_revoked(44), certificate_expired(45), certificate_unknown(46), illegal_parameter(47), unknown_ca(48), access_denied(49), decode_error(50), decrypt_error(51), export_restriction_RESERVED(60), protocol_version(70), insufficient_security(71), internal_error(80), user_canceled(90), no_renegotiation(100), unsupported_extension(110)

close_notify であれば「これ以上暗号化通信するものがないことを相手に伝える」という意味で、正常終了ですが、その他は名前が表す通りに何かしらの原因により異常終了するものです。

また、Ignored Unknown Record と表示される場合は、『定義されていないContent Typeが使われている』という意味です。例えば Windows のリモートデスクトップは TLS での暗号化を実装していますが、独自のカスタマイズをしているようで、パケットキャプチャで見てみると Content Type = 0x03 というRFC では定義されていない Record Protocol を使っています。

RFC 2246 (TLS v1.0) においては『理解できない Record Type は無視すべき』と書かれておりそれを受けての『Ignored Unknown Record』なのでしょう。ですがこれはクライアントとサーバが無視したということにはならず、Wireshark が RFC に従ってそのように解釈しただけです。RDPの場合もそうですが、実際にはクライアントとサーバ間では解釈出来ているケースもあるでしょう(例えばWiresharkのバージョンが古いと、TLS の新バージョンで定義された Content Type (= Record Type) は理解できません。)

https の一般的な通信フロー

ここで、一般的な https 通信のフローを再確認します。

SSL/TLSのレイヤーは何層?

前述の通り、TLSコネクション開始のネゴシエーションは『TCP 3way ハンドシェイク』と『暗号化対象のhttp通信』の間に存在しています。このことからも TLS のレイヤーは TCP 以上、http 以下であることが推察されます。

また、パケット構造を見ても、位置的に同様のことが言えます。

諸説あるようですが、nesuke 的には OSI 参照モデルのセッション層扱い、IPセットモデルだとアプリケーション層扱い(TLS 単体でトランスポート層の機能は無いので、暗号化を行うアプリケーションという位置付けになるはず)です。

フォローする