Private IP アドレスの HAProxy を Let's Encrypt の証明書で HTTPS 運用


オフィスにあるサーバで運用している HAProxy に VPN 経由で https アクセスしたくて、証明書を Let's Encrypt で作成して設定したメモです。

環境

  • DNS: AWS Route53 を利用
  • OS: Ubuntu 18.04.1
  • HAProxy

Certbot のインストール

Certbot - Ubuntubionic Nginx を参考にしてインストールしました

Add Certbot PPA

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update

Install Certbot

$ sudo apt-get install certbot python-certbot-nginx

証明書の作成

$ sudo certbot certonly --manual --preferred-challenges dns
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel):

と聞かれるので、所有するドメイン名を入力します。そのとき、ワイルドカードを利用すると便利です。

*.example.com

DNS に TEXT レコードを作成する名前と値が表示されますので、DNS にレコードを追加します。

_acme-challenge.example.com TXT "<設定する値>"

DNS への反映に若干時間がかかる場合があるので、少し待って Enter キーを押した方がいいと思います。

成功すれば、/etc/letsencrypt/live/example.com/ 以下にファイルが作成されます。

Private IP アドレスの DNS レコードの登録

DNS に A レコードを作成します。

internal.example.com A 192.168.1.1

HAProxy の設定

fullchain.pem と privkey.pem を結合します。

cat fullchain.pem privkey.pem > server.pem

/etc/haproxy/haproxy.cfg

を編集します。

global
    daemon
    maxconn 100
    ssl-default-bind-options ssl-min-ver TLSv1.2
    tune.ssl.default-dh-param 2048

defaults
    mode http
    timeout connect 50000ms
    timeout client  50000ms
    timeout server  50000ms

frontend https-in
    bind *:443 ssl crt /etc/letsencrypt/live/example.com/server.pem
    default_backend servers

backend servers
    server server1 127.0.0.1:8080 maxconn 100
    option forwardfor
    http-request set-header X-Forwarded-Host %[req.hdr(host)]
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }

HAProxy を再起動します

$ sudo systemctl restart haproxy