HAProxyでSSL処理をできるようにする

by carianoff



ロードバランサとかリバースプロキシを使って色々やっていると、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"とかのキーワードでひっかけると追いやすいです。


それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́