2011年3月9日水曜日

apacheのリバースプロキシでSSL接続しちゃう

どうも、俺@仕事中です。

またまたハマりました。
タイトル通り、apache(2系)のリバースプロキシ機能を使ってローカル内のapacheにSSL接続しようと思ってハマりました。
ググったらたくさん参考資料出てくるんですけどね、、

イメージは
クライアントブラウザ →(SSL)→ Proxyサーバ[192.168.10.10] →(SSL)→ ローカルapacheサーバ[192.168.10.11]
です。

まずapacheをインストールする際に mod_proxyとmod_ssl、mod_proxy_connectが有効になっていないといけません。(多分、、)
# /usr/local/apache2/bin/httpd -l
で上記のモジュールが出てくれば問題ありませんが、なければapacheをインストールし直しましょう。
# ./configure --enable-module=so --with-included-apr --enable-proxy --enable-ssl --enable-proxy-connect
オプションは環境に合わせて変えてください。
# make && make install

では、まずhttpd.confでリバースプロキシの設定しましょう。
# vim /usr/local/apache2/conf/httpd.conf
----------------------------------------------
# 以下を追加
ProxyRequests off
ProxyPass / http://192.168.10.11/
ProxyPassReverse /http://192.168.10.11/
ProxyPassReverseCookieDomain mydomain local-domain
ProxyPassReverseCookiePath / /
<Proxy *>
 order deny,allow
 deny from all
 allow from xxx.xxx.xxx.0/24 ....# あとは適当に
</Proxy>
リバースプロキシだけの設定では以上です。

これからSSLの設定を行いましょう。
※証明書の作り方は以前(opensslを使って秘密鍵と証明書の作成)も書いたのでそちらも参照ください。

オレオレ証明書作ります。
まず、CA秘密鍵作成
# openssl genrsa -rand /var/log/messages -out ca.key 1024
-randオプションはランダムなデータを作成する元となるファイルを適当に選択。
次にCA証明書の署名要求作成
# openss req -new -key ca.key -out ca.csr
ここは色々質問されますが、内容は割愛します。
では次に証明書発行
# openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
これでCA証明書まで完成です。

次はサーバ用証明書を作成しましょう。
まずサーバ用秘密鍵を作ります
# openssl genrsa -rand /var/log/maillog -out server.key 1024
↑と一緒ですね。
次にサーバ証明書の署名要求を作ります
# openssl req -new -key server.key -out server.csr
これも↑と一緒。
次にシリアルを記述した適当なファイルを作成
# echo 01 > ca.serial
では証明書を発行しちゃいましょう
# openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -in server.csr -out server.crt
出来ました!

これを適当な場所へコピー(移動)します。
# cp server.crt /usr/local/apache2/conf/ssl/server.crt # ←サーバ証明書
 # cp server.key /usr/local/apache2/conf/ssl/server.key # ←サーバ秘密鍵
ふぅ。


最後にapacheの設定です。
# vim /usr/local/apache2/conf/httpd.conf
-----------------------------------------------
<IfModule mod_ssl.c>
 Include conf/ssl.conf
</IfModule>

 # vim /usr/local/apache2/conf/ssl.conf (必要な部分のみ抜粋)
----------------------------------------
Listen 443
<VirtualHost _default_:443>
SSLCertificateFile /usr/local/apache2/conf/ssl/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server.key
<VirtualHost>

#SSLCACertificatePath /usr/local/apache2/conf/ssl.crt いらない!?
#SSLCACertificateFile /usr/local/apache2/conf/ssl-bundle.crt いらない!?

#SSLVerifyClient require いらない。クライアントの認証が必要であれば付ける
#SSLVerifyDepth 1 いらない

SSLProxyEngine on
ProxyPass / https://192.168.10.11/ # ローカルのapacheが例えば4444ポートでSSLを動かしてる場合は ProxyPass / https://192.168.10.11:4444/ね
ProxyPassReverse / https://192.168.10.11/ # こっちも ProxyPassReverse / https://192.168.10.11:4444/ね
出来ましたー!!

起動!!
# /usr/local/apache2/bin/httpd -k start -DSSL
たぶんパスフレーズ聞かれるので応えてあげてね。
ちなみにパスフレーズを聞かれるのが面倒な人は
# vim /usr/local/apache2/conf/ssl.conf
----------------------------------------------
SSLPassPhraseDialog exec:/usr/local/apache2/bin/pp-exec
# パスフレーズを入力するためのダイアログタイプ。builtin(デフォルト)またはexec。
で、
# vim /usr/local/apache2/bin/pp-exec
------------------------------------------
#!/bin/sh
echo "パスフレーズ"
だぜ!



以上でぇぇぇぇぇぇぇぇぇぇぇす。

0 件のコメント: