squidでSSLアクセラレータを作ってみた


SSLアクセラレータを1台作っておけば、バックエンドのwebサーバが何台あっても
証明書はアクセラレータにだけ入れておけばいいんでね?という
安易な発想で作ってしまった。

もっとも、ベリサインとかグローバルサインなどの証明書発行機関では
規約上、アクセラレータの後ろに複数のwebサーバがあるんだったら、台数分のライセンス買えといっているので
証明書代の節約はあんまり期待できない (´・ω・`)
一応、ボリュームライセンスはあるっちゃーあるが。

でも、せっかくなので、アクセラレータ1台とwebサーバ1台を作ってみた。


ここを参考に作ってみた。

■■ 検証環境について

アクセラレータ
ホスト名:vh110
IPアドレス:192.168.0.110

webサーバ
ホスト名:vh120
バーチャルホスト:www.example.tld
IPアドレス:192.168.0.120

■ vh110にsquidをインストールする

[root@vh110 ~]# yum install squid

■ 設定

[root@vh110 ~]# cd /etc/squid/
[root@vh110 squid]# chmod +r squid.conf
[root@vh110 squid]# vi squid.conf

#  TAG: http_port
の箇所で、
ここを
# http_port 3128

こうする
# http_port 3128
http_port 80

#  TAG: https_port
の箇所で、
ここを
#Default:
# none

こうする
#Default:
# none
https_port 443 cert=/etc/squid/ssl/newcert.pem key=/etc/squid/ssl/private.key

ここを
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports

こうする
# Only allow cachemgr access from localhost
http_access allow all
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports

#  TAG: visible_hostname
の箇所で、
ここを
#Default:
# none

こうする
#Default:
# none
visible_hostname www.example.tld

#  TAG: httpd_accel_host
#  TAG: httpd_accel_port
の箇所で、
ここを
#Default:
# httpd_accel_port 80

こうする
#Default:
# httpd_accel_port 80
httpd_accel_host virtual
httpd_accel_port 80

#  TAG: httpd_accel_uses_host_header    on|off
の箇所で、
ここを
#Default:
# httpd_accel_uses_host_header off

こうする
#Default:
# httpd_accel_uses_host_header off
httpd_accel_uses_host_header on

以上を編集して保存。

■■ 秘密鍵と証明書の作成

■ ディレクトリの作成

[root@vh110 squid]# mkdir ssl
[root@vh110 squid]# cd ssl/
[root@vh110 ssl]# pwd
/etc/squid/ssl

■ 秘密鍵の作成

[root@vh110 ssl]# openssl genrsa -des3 -out private.key 1024

■ 秘密鍵の確認

[root@vh110 ssl]# openssl rsa -text -noout -in private.key
Enter pass phrase for private.key:
Private-Key: (1024 bit)

■ CSRの生成

[root@vh110 ssl]# openssl req -new -key private.key -out csr.pem
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Hokkaido
Locality Name (eg, city) [Newbury]:Sapporo
Organization Name (eg, company) [My Company Ltd]:nullpopopo
Organizational Unit Name (eg, section) []:nullpopopo
Common Name (eg, your name or your server's hostname) []:www.example.tld
あとは空エンター

■ CSRの確認

[root@vh110 ssl]# openssl req -text -noout -in csr.pem
        Subject: C=JP, ST=Hokkaido, L=Sapporo, O=nullpopopo, OU=nullpopopo, CN=www.example.tld

■ 秘密鍵のパスフレーズ解除

[root@vh110 ssl]# cp -p private.key private.key.passphrased
[root@vh110 ssl]# openssl rsa -in private.key -out private.key
Enter pass phrase for private.key:
writing RSA key

■ 秘密鍵からパスフレーズが抜けたことを確認する

[root@vh110 ssl]# openssl rsa -text -noout -in private.key

■ 証明書の作成

[root@vh110 ssl]# openssl x509 -in csr.pem -out newcert.pem -req -signkey private.key -days 365
Signature ok
subject=/C=JP/ST=Hokkaido/L=Sapporo/O=nullpopopo/OU=nullpopopo/CN=www.example.tld
Getting Private key

■ 証明書の確認

[root@vh110 ssl]# openssl x509 -text -noout -in newcert.pem
        Issuer: C=JP, ST=Hokkaido, L=Sapporo, O=nullpopopo, OU=nullpopopo, CN=www.example.tld
        Validity
            Not Before: Oct 30 14:37:00 2007 GMT
            Not After : Oct 29 14:37:00 2008 GMT
        Subject: C=JP, ST=Hokkaido, L=Sapporo, O=nullpopopo, OU=nullpopopo, CN=www.example.tld

■■ squidを起動する

■ 起動

[root@vh110 ~]# /etc/init.d/squid start
squid を起動中: .                                          [  OK  ]

■ 自動起動設定

[root@vh110 ~]# chkconfig squid --list
squid           0:off   1:off   2:off   3:off   4:off   5:off   6:off

[root@vh110 ~]# chkconfig squid on

[root@vh110 ~]# chkconfig squid --list
squid           0:off   1:off   2:on    3:on    4:on    5:on    6:off

■■ vh120にapacheをインストールする

いつものようにインストール。
www.example.tld のバーチャルホストを作成しておく。

■■ 接続試験

クライアントのhostsに
192.168.0.110 www.example.tld
と書いておくか、DNSサーバでAレコードを指定する。

vh110のhostsには
192.168.0.120           www.example.tld
と書いておく

クライアントPCから
http://www.example.tld/
https://www.example.tld/

にアクセスして、vh120のログを注視する。
ログにはvh110からアクセスがあればOK。

■■ わかったこと、疑問点

とりあえず、単一のホストでのアクセラレータはできた。
で、どうやったらIPベースのバーチャルホストができるのか?

http://iret-onsoku.blogspot.com/2007/10/squidapache.html

をヒントにできそうだ。

要は
vh110(アクセラレータ側)に、追加NICなりaliasなり設定する
http_port 80

http_port 192.168.0.110:80 とか~111:80にして
https_port 443 cert=/etc/squid/ssl/newcert.pem key=/etc/squid/ssl/private.key

https_port IP_addr:443 cert=/etc/squid/ssl/newcert.pem key=/etc/squid/ssl/private.key
https_port IP_addr2:443 cert=/etc/squid/ssl/newcert2.pem key=/etc/squid/ssl/private2.key
とかにすればよいと思う

けど眠いから明日にしよう。。。