プロキシサーバとHTTPS通信の関係
HTTPのプロキシサーバは、HTTPSの暗号化通信(SSL)をきちんと扱えるのでしょうか?HTTPSの通信を行う場合は、ユーザエージェントはCONNECTメソッドで接続したい相手をプロキシに伝え、暗号通信に必要なSSLサーバ証明書と公開鍵を取得してもらい、その後、暗号化通信を行います。
読み方
- HTTPS
- えいてぃてぃぴーえす
目次
概要
HTTPのプロキシサーバは、HTTPSの暗号化通信をきちんと扱えるのでしょうか?
ブラウザ -> プロキシ -> ウェブサーバ
HTTPSの通信を行う場合は、プロキシサーバは、通信を透過的に扱います。 クライアントは、プロキシサーバに、HTTPのCONNECTメソッドを使用します。
プロキシサーバを利用して、HTTPS通信を行う場合、ブラウザなどのユーザエージェントは、以下のリクエストをプロシキサーバに送信し、プロキシサーバから接続先のウェブサーバの公開鍵とSSLサーバ証明書を転送してもらいます。
CONNECT server_name:443 HTTP/1.1
以降の通信は、暗号化が行われ、プロキシサーバ自体は、パケットの転送だけを行います。
HTTPSプロキシの検証環境の構築
$ 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の段階では、接続先しかわかっていません。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 --
関連項目
ツイート