QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

SSLでHTTPメッセージはどの部分が暗号化されるの?

「Javaを紐解くための重点キーワード」の”Java Servlet(サーブレット)”(http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey01.html)の
”セッション管理”の”JSP、Servletを使ったセッション管理”に
HTTPプロトコルを、インターネット上で電子商取引に使うとき、暗号化が必要である。これには多くの場合SSLという暗号化技術が使われる。SSLはHTTPプロトコルの本文部分を暗号化する。HTTPリクエストの本文には、POST方式で作られたパラメータやクッキー情報が入る。GET方式でパラメータ渡しをする場合や、URL再書き込みによるセッションIDなどは、この暗号化に含まれない。このため、ネットワーク・トレースなどによるのぞき見行為に対して、URL再書き込みによるセッションIDは無防備であるといえる。SSLを使ったサイトを構築するためには、GET方式やURL再書き込みは向いていないということである。
とあります。
SSLにおいてHandshake(SSLのセッション確立)が完了した後のクライアント(ブラウザ)とサーバ(Webサーバ)間の電文はすべて暗号化されると認識していますが違うのでしょうか。HTTPメッセージのメッセージボディのみが暗号化される(メッセージヘッダは暗号化されない)という事でしょうか。どなたか教えて頂けないでしょうか。

質問者:hrfujiwa

回答

SSLにおいてHandshake(SSLのセッション確立)が完了した後のクライアント(ブラウザ)とサーバ
(Webサーバ)間の電文はすべて暗号化されると認識していますが違うのでしょうか。

私もこのように認識していました。

HTTPメッセージのメッセージボディのみが暗号化される(メッセージヘッダは暗号化されない)という事でしょうか。どなたか教えて頂けないでしょうか。

試しに Linux の tcpdump で通信内容を capture してみましたが、
GET .... という部分まで暗号されているように見受けられます。
(きちんとした回答でなくて申し訳ないですが)

投稿者:yuzy

編集 履歴 (0)

ボディだけです。その証拠にProxyを通さなきゃならない環境でもHTTPSを使えます。

投稿者:t-wata

編集 履歴 (0)

ボディだけです。その証拠にProxyを通さなきゃならない環境でもHTTPSを使えます。
??? Proxyが見るのはIPヘッダではないですか?HTTP・HTTPS内のメッセージヘッダはProxyには必要ないものではないでしょうか。(とは言いつつもネットワークの専門ではないので自信はありません。間違えていたらごめんなさい)

Netscape社のSSL関連のドキュメントを見ると
http://developer.netscape.com/docs/manuals/security/sslin/index.htm

An encrypted SSL connection requires all information sent between a client and a server to be encrypted by the sending software and decrypted by the receiving software, thus providing a high degree of confidentiality.

って書いてあります。Getのヘッダもinformationの一部なので暗号化されるのではないでしょうか?(あまり自信ないのですが…)

投稿者:H2

編集 履歴 (0)

私も調べてみました。
SSLってセッション層のプロトコルなんですね。勘違いしてました。

http://wp.netscape.com/eng/ssl3/draft302.txt より抜粋。

5.7 Application data protocol

Application data messages are carried by the Record Layer and are

fragmented, compressed and encrypted based on the current

connection state. The messages are treated as transparent data to

the record layer.

ということで、HTTPのヘッダもボディも暗号化なりのセキュリティを得られそうです。

ただ、引用もとの「GETを使うな」という趣旨は昔からよく言われており、
HTTP Proxyを通した際のログなどにURLの一部として記録されてしまったりと
セキュリティ的には薦められたものではないのは確かではないでしょうか。

私の理解ではProxyは各プロトコルごとに必要であって、IPヘッダだけを見ている
わけではないと思いますが・・・(自信はありません)
HTTPSが通るのはたまたまHTTP/HTTPSに対応してるだけだと思うのですが。

投稿者:まりり

編集 履歴 (0)

ご回答 ありがとうございました。
暗号化されるようですね。
@IT内の各種資料を読みますと、ソース表示をするとパラメータの値が見える等など
の理由でGETではなくPOSTで行うのが良いとわかりました。

投稿者:hrfujiwa

編集 履歴 (0)

t-wataさんの書き込み (2002-08-28 19:57) より:

ボディだけです。その証拠にProxyを通さなきゃならない環境でもHTTPSを使えます。

これは、ちょっと違うのでコメントさせてください。
SSL のproxy は、SSLトンネリングと呼ばれる手法で実現されています。
この場合、proxy は SSL セッションの中身は右から左に丸投げするだけで何も見てません。

ブラウザから、"https://somewhere.com/somewhat?param=hoge" を見ようとした時、
ブラウザから proxy には、


CONNECT somewhere.com:443 HTTP/1.1

のコマンドを投げ、proxy は、somewhere.com:443 とのセッションを張りに行って確立すると、あとは、ブラウザと somewhere.comとの間にいて、中身は何も見ず、受け渡しの仲介をしているだけです。
HTTPヘッダの中身はおろか、SSL 通信であるかどうかすら、proxy にとっては、どうでもよく、また、うかがい知れる話でもありません。

そういう意味では、「proxy でも通るからヘッダは暗号化されていないはずだ」という理屈は成り立ちません。実際、他の人もおっしゃっているとおり、暗号化されているはずです。

また、SSLトンネリングの場合、上記のように、proxy に伝わる情報は、あて先サーバとポート番号のみなので、GET メソッドであっても、そのパラメタの内容は proxy にはわかりませんので、proxy 上のログにも残らないはずです。(というか、GETメソッドかどうかすら、もっと言えば、HTTPSかどうかすら、proxy は知りようがない)
ただ、クライアント上の履歴には、やはり残るでしょうから、依然として、セキュリティ上奨められないとは思います。

ご参照: ftp://ftp.isi.edu/in-notes/rfc2817.txt Upgrading to TLS Within HTTP/1.1

投稿者:omatsu

編集 履歴 (0)

「proxy でも通るからヘッダは暗号化されていないはずだ」という理屈は成り立ちません。

ですね。間違ってました。HTTPSの場合は、HTTPの場合と異なり、proxyはトンネリングするようですね。

ご指摘有難うございました。

投稿者:t-wata

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。