Squid Reverse Proxy with Domain Based Virtual Hosting for HTTPS

以下のように経路全てをHTTPSで暗号化したい場合、設定工数がぐっと増えます。

クライアント(Webブラウザ) ⇔(HTTPS)⇔ Squid(Reverse Proxy) ⇔(HTTPS)⇔ 実サーバ群

まずは実サーバ群の1台1台にもSSL証明書(公開鍵証明書)のインストールが必要になります。
実サーバの台数分、秘密鍵を生成→CSRを生成→公開鍵証明書の作成を繰り返してください。
暗号化さえされていれば良いなら、手を抜く方法もあります...もちろん自己責任なのは言うまでもありません。
(この設定方法は割愛します)

4. Squid設定ファイル(/etc/squid/squid.conf)の編集

visble_hostname CentOS4
http_port 192.168.1.1:80 accel vhost
https_port 192.168.1.1:443 accel vhost cert=/etc/pki/CA/certs/server.pem key=/etc/pki/CA/private/server.key

acl http_access proto HTTP
acl https_access proto HTTPS

# first.example.com -> 192.168.1.2(port 80)
acl site-1 dstdomain first.example.com
http_access allow site-1
cache_peer 192.168.1.2 parent 80 0 no-query originserver name=sv-1
cache_peer_access sv-1 allow site-1 http_access
cache_peer_access sv-1 deny all

# first.example.com -> 192.168.1.2(port 443)
cache_peer 192.168.1.2 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-1-ssl
cache_peer_access sv-1-ssl allow site-1 https_access
cache_peer_access sv-1-ssl deny all

# second.example.com -> 192.168.1.3(port 80)
acl site-2 dstdomain second.example.com
http_access allow site-2
cache_peer 192.168.1.3 parent 80 0 no-query originserver name=sv-2
cache_peer_access sv-2 allow site-2 http_access
cache_peer_access sv-2 deny all

# second.example.com -> 192.168.1.3(port 443)
cache_peer 192.168.1.3 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-2-ssl
cache_peer_access sv-2-ssl allow site-2 https_access
cache_peer_access sv-2-ssl deny all

# third.example.com -> 192.168.1.4(port 80)
acl site-3 dstdomain third.example.com
http_access allow site-3
cache_peer 192.168.1.4 parent 80 0 no-query originserver name=sv-3
cache_peer_access sv-3 allow site-3 http_access
cache_peer_access sv-3 deny all

# third.example.com -> 192.168.1.4(port 443)
cache_peer 192.168.1.4 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-3-ssl
cache_peer_access sv-3-ssl allow site-3 https_access
cache_peer_access sv-3-ssl deny all

同じFQDNでHTTPとHTTPSにアクセスさせる場合、うまく動作せずに悩みました。
WebブラウザからSquid(Reverse Proxy)にHTTPS(SSL)でアクセスしても実サーバにはHTTPでしかアクセスしなくて...orz
悩んで悩みぬいた末、「cache_peer_access」にドメイン名(dstdomain)の他にプロトコル(proto)をANDで条件指定することで解決!

acl http_access proto HTTP
acl https_access proto HTTPS

HTTPプロトコルのaclとして「http_access」、HTTPSプロトコルのaclとして「https_access」を定義
プロトコルではなくポート番号でも可能ですが、ここは敢えてプロトコル指定で( ・`д・´)

cache_peer 192.168.1.2 parent 80 0 no-query originserver name=sv-1
cache_peer 192.168.1.3 parent 80 0 no-query originserver name=sv-2
cache_peer 192.168.1.5 parent 80 0 no-query originserver name=sv-3

実サーバ(HTTP)の定義。ここの変更は無し。

cache_peer 192.168.1.2 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-1-ssl
cache_peer 192.168.1.3 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-2-ssl
cache_peer 192.168.1.5 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-3-ssl

実サーバ(HTTPS)の定義。「sslflags=DONT_VERIFY_PEER」を入れないと公開鍵証明書の検証でエラーになります。

cache_peer_access sv-1 allow site-1 http_access
cache_peer_access sv-1 deny all
cache_peer_access sv-2 allow site-2 http_access
cache_peer_access sv-2 deny all
cache_peer_access sv-3 allow site-3 http_access
cache_peer_access sv-3 deny all

HTTPプロトコルの転送設定。site-xの後に「http_access」を入れてプロトコルをHTTPのみに制限しています。
そうしないとHTTPSのアクセスもdstdomainのaclだけでマッチしてしまい、下のルールに飛ばなくなります。
ここになかなか気付けませんでした。

cache_peer_access sv-1-ssl allow site-1 https_access
cache_peer_access sv-1-ssl deny all
cache_peer_access sv-2-ssl allow site-2 https_access
cache_peer_access sv-2-ssl deny all
cache_peer_access sv-3-ssl allow site-3 https_access
cache_peer_access sv-3-ssl deny all

HTTPSプロトコルの転送設定。site-xの後に「https_access」を入れてプロトコルをHTTPSのみに制限しています。
「cache_peer_domain」ではなく「cache_peer_access」を使う真骨頂かと思います。

いかがでしょうか?
自身の環境に置き換えて設定してもらえれば動くと思います。
Squidはaclを把握することが大事なんですね。
aclを使いこなせればURIによって振り分けするサーバを指定出来ることでしょう。

全ての経路をHTTPSにする必要性や意義はあるのか?と聞かれると答えるのが難しいですね。
まぁ、自分は技術者だから試したかっただけです(笑)

Squid Reverse Proxy with Domain Based Virtual Hosting for HTTPS” に対して1件のコメントがあります。

  1. Admiring the time and energy you put into your site and in depth information you offer.
    It's good to come across a blog every once in a while that isn't the same unwanted rehashed material.
    Great read! I've saved your site and I'm adding your RSS feeds to
    my Google account.

コメントは受け付けていません。