プロキシサーバとHTTPS通信の関係

提供: セキュリティ
移動: 案内検索
スポンサーリンク

HTTPのプロキシサーバは、HTTPSの暗号化通信(SSL)をきちんと扱えるのでしょうか?HTTPSの通信を行う場合は、ユーザエージェントはCONNECTメソッドで接続したい相手をプロキシに伝え、暗号通信に必要なSSLサーバ証明書公開鍵を取得してもらい、その後、暗号化通信を行います。

読み方

HTTPS
えいてぃてぃぴーえす

概要

HTTPのプロキシサーバは、HTTPSの暗号化通信をきちんと扱えるのでしょうか?

ブラウザ -> プロキシ -> ウェブサーバ

HTTPSの通信を行う場合は、プロキシサーバは、通信を透過的に扱います。 クライアントは、プロキシサーバに、HTTPCONNECTメソッドを使用します。

プロキシサーバを利用して、HTTPS通信を行う場合、ブラウザなどのユーザエージェントは、以下のリクエストをプロシキサーバに送信し、プロキシサーバから接続先のウェブサーバの公開鍵SSLサーバ証明書を転送してもらいます。

CONNECT server_name:443 HTTP/1.1

以降の通信は、暗号化が行われ、プロキシサーバ自体は、パケットの転送だけを行います。

HTTPSプロキシの検証環境の構築

Ubuntusquidを動作させました。

$ apt install curl squid3
$ squid3

curlコマンドを用いて、プロキシサーバ経由のHTTPSのリクエストの例

curlコマンドを利用して、試してみました。 ローカルホストで実行しているプロキシサーバ squid に接続し、CONNECT メソッドで通信を開始します。

root@5ecf56dbad43:/# curl -v -x localhost:3128 https://login.yahoo.co.jp/ |&head -n 30
* Hostname was NOT found in DNS cache
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--
  0*   Trying ::1...
* Connected to localhost (::1) port 3128 (#0)
* Establish HTTP proxy tunnel to login.yahoo.co.jp:443
> CONNECT login.yahoo.co.jp:443 HTTP/1.1
> Host: login.yahoo.co.jp:443
> User-Agent: curl/7.35.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connection established
< 
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--
  0* Proxy replied OK to CONNECT request

squidのアクセスログは、以下の通りです。

1433004291.536    247 ::1 TCP_MISS/200 6877 CONNECT login.yahoo.co.jp:443 -
HIER_DIRECT/114.111.71.238 -

HTTPの通信をもう少し細かく見てみましょう。

  1. プロキシにCONNECTメソッドで接続依頼をする
  2. SSLの通信を開始する
  3. HTTPリクエストを送信する

このように、通信を行っています。 1の段階では、接続先しかわかっていません。3の段階になって、ようやく、アクセスするパスが明らかになります。

* Connected to localhost (::1) port 3128 (#0)
* Establish HTTP proxy tunnel to login.yahoo.co.jp:443
> CONNECT login.yahoo.co.jp:443 HTTP/1.1
> Host: login.yahoo.co.jp:443
> User-Agent: curl/7.35.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connection established
< 
* Proxy replied OK to CONNECT request
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Server hello (2):
{ [data not shown]
* SSLv3, TLS handshake, CERT (11):
{ [data not shown]
* SSLv3, TLS handshake, Server key exchange (12):
{ [data not shown]
* SSLv3, TLS handshake, Server finished (14):
{ [data not shown]
* SSLv3, TLS handshake, Client key exchange (16):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
} [data not shown]
* SSLv3, TLS handshake, Finished (20):
} [data not shown]
* SSLv3, TLS change cipher, Client hello (1):
{ [data not shown]
* SSLv3, TLS handshake, Finished (20):
{ [data not shown]
* SSL connection using ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
* 	 subject: C=JP; ST=Tokyo; L=Minato-Ku; O=Yahoo Japan Corporation;
	 CN=login.yahoo.co.jp
* 	 start date: 2015-04-16 09:01:02 GMT
* 	 expire date: 2015-12-31 14:59:59 GMT
* 	 subjectAltName: login.yahoo.co.jp matched
* 	 issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Organization Validation CA - G2
* 	 SSL certificate verify ok.
> GET /config/login HTTP/1.1
> User-Agent: curl/7.35.0
> Host: login.yahoo.co.jp
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Sun, 07 Jun 2015 10:11:53 GMT
< P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR
CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi
IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: private
< Vary: Accept-Encoding
< Content-Type: text/html; charset=UTF-8
< Age: 0
< Transfer-Encoding: chunked
< Connection: close
* Server ATS is not blacklisted
< Server: ATS
<

フィルタリング

  • HTTPの通信は、コンテンツフィルタリングが可能です。
  • HTTPの通信は、コンテンツフィルタリングが出来ません
    • 接続するサーバでのアクセス制御しかできません。

HTTPS通信の内容をチェックする方法

プロキシサーバで、セキュリティ確保の目的でSSLの通信の内容をチェックするケースがあります。 その場合は、ウェブサーバの証明書と同じコモンネームの証明書をプロキシサーバで作成し、ブラウザ(UserAgent)に送信します。クライアント側(ブラウザ)には、あらかじめ、プロキシサーバの証明書を登録しておく必要があります。

ブラウザ -- CONNECT --> プロキシ ------------> ウェブサーバ
         <- 証明書2 --- プロキシ <- 証明書1 --

関連項目




スポンサーリンク