ロードバランサとかリバースプロキシを使って色々やっていると、HTTPS/SSL対応かー、どうしようかなーみたいなことを考える日がそのうちやってきたりするかもしれません。
さて、最近触り始めたHAProxyなんですが、公式サイトの記載を見ていると、開発版のバージョンだとSSL処理をサポートしているみたいなんですよねー。
Update [2012/09/11] : native SSL support was implemented in 1.5-dev12. The points above about CPU usage are still valid though.
HAProxy - The Reliable, High Performance TCP/HTTP Load Balancer
ふむふむ、"1.5-dev12"以降のバージョンであれば使えそう。
ということで、前回のエントリ「HAProxy1.5系(開発版)のRPMを作成する」の続きですが、SSL対応版のHAProxyをインストールして、確認してみようと思いまする。
SSL対応版のHAProxyをビルド
上記のエントリで、HAProxyのRPMファイルを作りましたが、この環境を使ってRPMを作り直すところからはじめてみます。
(ディレクトリ構成やファイルなんかは、↑のエントリを参考にしてください。)
といってもRPMを作った環境があれば、specファイル(rpmbuild/SPECS/haproxy.spec)の修正がメインですw
# diff -c haproxy.spec{.bak,} *** haproxy.spec.bak 2013-11-28 18:46:38.722931990 +0900 --- haproxy.spec 2013-11-29 15:30:52.222283278 +0900 *************** *** 1,13 **** Summary: HA-Proxy is a TCP/HTTP reverse proxy for high availability environments Name: haproxy ! Version: 1.5-dev19 ! Release: 1 License: GPL Group: System Environment/Daemons URL: http://haproxy.1wt.eu/ Source0: http://haproxy.1wt.eu/download/1.5/src/devel/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-root ! BuildRequires: pcre-devel Requires: /sbin/chkconfig, /sbin/service %description --- 1,13 ---- Summary: HA-Proxy is a TCP/HTTP reverse proxy for high availability environments Name: haproxy ! Version: 1.5_dev19 ! Release: 2 License: GPL Group: System Environment/Daemons URL: http://haproxy.1wt.eu/ Source0: http://haproxy.1wt.eu/download/1.5/src/devel/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-root ! BuildRequires: pcre-devel, openssl-devel Requires: /sbin/chkconfig, /sbin/service %description *************** *** 33,39 **** %define __perl_requires /bin/true %build ! %{__make} USE_PCRE=1 DEBUG="" ARCH=%{_target_cpu} TARGET=linux26 %install [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} --- 33,39 ---- %define __perl_requires /bin/true %build ! %{__make} USE_PCRE=1 DEBUG="" ARCH=%{_target_cpu} TARGET=linux26 USE_OPENSSL=1 %install [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
こんな感じで %buildのところで"USE_OPENSSL=1"とフラグをたててビルドするようにすればOKです。
あと、当然ながらopenssl-develが必要になりますので、BuildRequires に書いておくようにしましょう。
(できることならCHANGELOGも更新しておきましょう...汗)
# cd ~/rpmbuild/SPECS/ # rpmbuild -ba haproxy.spec
"rpmbuild/SOURCES"にHAProxyのtarballが配置してあれば、あとはビルド!です。
SSL対応版のHAProxyをインストール
# rpm -Uvh ~/rpmbuild/RPMS/x86_64/haproxy-1.5_dev19-2.x86_64.rpm 準備中... ########################################### [100%] 1:haproxy ########################################### [100%]
まずはインストール(もしくはアップデート)。
# haproxy -vv HA-Proxy version 1.5-dev19 2013/06/17 Copyright 2000-2013 Willy Tarreau <w@1wt.eu> Build options : TARGET = linux26 CPU = generic CC = gcc CFLAGS = -m64 -march=x86-64 -O2 -g -fno-strict-aliasing OPTIONS = USE_OPENSSL=1 USE_PCRE=1 Default settings : maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200 Encrypted password support via crypt(3): yes Built without zlib support (USE_ZLIB not set) Compression algorithms supported : identity Built with OpenSSL version : OpenSSL 1.0.0-fips 29 Mar 2010 Running on OpenSSL version : OpenSSL 1.0.0-fips 29 Mar 2010 OpenSSL library supports TLS extensions : yes OpenSSL library supports SNI : yes OpenSSL library supports prefer-server-ciphers : yes Built with PCRE version : 7.8 2008-09-05 PCRE library supports JIT : no (USE_PCRE_JIT not set) Built with transparent proxy support using: IP_TRANSPARENT IP_FREEBIND Available polling systems : epoll : pref=300, test result OK poll : pref=200, test result OK select : pref=150, test result OK Total: 3 (3 usable), will use epoll.
きちんとSSLが組み込まれていることが確認できます。
(オレオレSSL証明書を作る)
ここで、SSL証明書が必要になります。
既に持っている方はそれを使いましょう。そうじゃない方はとりあえずテストなのでオレオレ証明書を作りましょう。
# openssl genrsa 2048 > server.key # openssl req -new -key server.key > server.csr # openssl x509 -days 730 -req -signkey server.key < server.csr > server.crt # cat server.key server.crt > server.pem
こんな感じでコマンドを発行すれば、有効期間が2年のオレオレSSL証明書のできあがりです。チーン
今回使うのは、"server.pem"になるので、適当な場所(/etc/haproxy配下とか)に配置してください。
haproxy.cfgの設定
"/etc/haproxy/haproxy.cfg"を修正します。
・・・・・省略・・・・・ frontend ssl-proxy bind *:443 ssl crt /etc/haproxy/server.pem mode http default_backend web-servers ・・・・・省略・・・・・
HAProxyの基礎的な設定部分は省略しますが、443ポートでbindするfrontendを以下のような感じで作るだけです。backendは特に修正する(意識する)必要はありません。
frontendでSSL処理をするので、backendのサーバは、80番ポート(ふつーのHTTP)で待ち受けていればOKです。
あとは、haproxyをreloadするなりして、設定を反映すればOKです。
動作確認
お好みでどうぞ。
# curl -I -k https://localhost/ HTTP/1.1 200 OK ・・・・・以下省略・・・・・
うまく動きました!
その他パラメータなど
HAProxy 1.5-dev用のConfiguration Manualが下記で公開されているので、これが参考になります。
普通の話ですが、"SSL"とかのキーワードでひっかけると追いやすいです。
それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́