序章

Let’s Encryptは、無料のTLS / SSL証明書を簡単に取得してインストールできる新しい認証局(CA)であり、Webサーバーで暗号化されたHTTPSを有効にします。 必要な手順のほとんどを自動化しようとするソフトウェアクライアントCertbotを提供することにより、プロセスを簡素化します。 現在、証明書の取得とインストールのプロセス全体は、ApacheWebサーバーでのみ完全に自動化されています。 ただし、Certbotを使用すると、無料のSSL証明書を簡単に取得できます。この証明書は、選択したWebサーバーソフトウェアに関係なく、手動でインストールできます。

このチュートリアルでは、Certbotを使用して無料のSSL証明書を取得し、Ubuntu14.04のHAProxyで使用する方法を示します。 また、SSL証明書を自動的に更新する方法についても説明します。

前提条件

このチュートリアルに従う前に、いくつかのことが必要になります。

ルートユーザー以外のユーザーがいるUbuntu14.04サーバーが必要です。 sudo 特権。 このようなユーザーアカウントを設定する方法については、Ubuntu 14.04 初期サーバー設定の手順1〜3を参照してください。

証明書を使用する登録済みドメイン名を所有または管理する必要があります。 まだドメイン名を登録していない場合は、そこにある多くのドメイン名レジストラの1つに登録できます(例: Namecheap、GoDaddyなど)。

まだ作成していない場合は、ドメインがサーバーのパブリックIPアドレスを指すAレコードを作成してください。 これが必要なのは、Let’s Encryptが、証明書を発行しているドメインを所有していることを検証する方法のためです。 たとえば、次の証明書を取得する場合 example.com、検証プロセスが機能するには、そのドメインがサーバーに解決される必要があります。 私たちのセットアップは使用します example.comwww.example.com ドメイン名として、両方のDNSレコードが必要です

すべての前提条件が整ったら、インストールに進みましょう certbot、Let’sEncryptクライアントソフトウェア。

ステップ1—Let’sEncryptクライアントのインストール

Let’s Encryptを使用してSSL証明書を取得するための最初のステップは、 certbot サーバー上のソフトウェア。 Certbot開発者は、ソフトウェアの最新バージョンを含むリポジトリを提供します。 そのリポジトリをパッケージマネージャーに追加しましょう。

  1. sudo add-apt-repository ppa:certbot/certbot

追加を確認するように求められます。 プレス ENTER 続ける。 次に、パッケージキャッシュを更新して、新しいパッケージリストを取得します。

  1. sudo apt-get update

そして最後に、 certbot パッケージ:

  1. sudo apt-get install certbot

今、私たちは certbot インストールすると、SSL証明書を取得する準備が整います。

ステップ2—証明書を取得する

Let’s Encryptは、さまざまなプラグインを介してSSL証明書を取得するためのさまざまな方法を提供します。 別のチュートリアルで説明されているApacheプラグインとは異なり、ほとんどのプラグインは、使用するWebサーバーを手動で構成する必要がある証明書の取得にのみ役立ちます。 証明書のみを取得し、それらをインストールしないプラグインは、サーバーに証明書を発行する必要があるかどうかを認証するために使用されるため、「認証者」と呼ばれます。

スタンドアロンプラグインを使用してSSL証明書を取得する方法を説明します。

ポート80が開いていることを確認します

スタンドアロンプラグインは、SSL証明書を取得するための非常に簡単な方法を提供します。 小さなWebサーバーを一時的に実行することで機能します(ポート上) 80 デフォルトでは)サーバー上で、Let’s Encrypt CAが接続し、証明書を発行する前にサーバーのIDを検証できます。 そのため、この方法ではそのポートが必要です 80 使用されていません。 つまり、ポートを使用している場合は、必ず通常のWebサーバーを停止してください。 80 (すなわち http)、このプラグインを使用する前に。

たとえば、HAProxyを使用している場合は、次のコマンドを実行してHAProxyを停止できます。

  1. sudo service haproxy stop

ポートかどうかわからない場合 80 が使用中の場合、次のコマンドを実行できます。

netstat -na | grep ':80.*LISTEN'

このコマンドを実行しても出力がない場合は、スタンドアロンプラグインを使用できます。

Certbotを実行する

次のコマンドを実行して、スタンドアロンプラグインを使用します。

  1. sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d example.com -d www.example.com

メールアドレスを入力し、Let’sEncryptの利用規約に同意するよう求められます。 その後、 http チャレンジが実行されます。 すべてが成功した場合、 certbot 次のような出力メッセージを出力します。

Output:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-09-06. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

上記の出力例で強調表示されている、証明書のパスと有効期限をメモしておく必要があります。

注:ドメインがCloudFlareなどのDNSサービスを介してルーティングされている場合は、証明書を取得するまで一時的に無効にする必要があります。

証明書ファイル

証明書を取得すると、次のPEMエンコードファイルが作成されます。

  • cert.pem:ドメインの証明書
  • chain.pem:Let’sEncryptチェーン証明書
  • fullchain.pem: cert.pemchain.pem 結合
  • privkey.pem:証明書の秘密鍵

作成したばかりの証明書ファイルの場所を知っておくことが重要です。これにより、Webサーバー構成でそれらを使用できるようになります。 ファイル自体は、のサブディレクトリに配置されます /etc/letsencrypt/archive. ただし、Certbotは、最新の証明書ファイルへのシンボリックリンクを作成します。 /etc/letsencrypt/live/your_domain_name ディレクトリ。

次のコマンドを実行して、ファイルが存在することを確認できます(ドメイン名に置き換えてください)。

  1. sudo ls /etc/letsencrypt/live/your_domain_name

出力は、前述の4つの証明書ファイルである必要があります。

fullchain.pemとprivkey.pemを組み合わせる

SSLターミネーションを実行するようにHAProxyを構成する場合、HAProxyとエンドユーザー間のトラフィックが暗号化されるため、組み合わせる必要があります。 fullchain.pemprivkey.pem 単一のファイルに。

まず、結合されたファイルが配置されるディレクトリを作成します。 /etc/haproxy/certs:

  1. sudo mkdir -p /etc/haproxy/certs

次に、これを使用して結合ファイルを作成します cat コマンド(強調表示されたものに置き換えます example.com あなたのドメイン名で):

  1. DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

次のコマンドを使用して、秘密鍵を含む結合ファイルへの安全なアクセスを行います。

  1. sudo chmod -R go-rwx /etc/haproxy/certs

これで、SSL証明書と秘密鍵をHAProxyで使用する準備が整いました。

ステップ3—HAProxyをインストールする

このステップでは、HAProxyのインストールについて説明します。 サーバーにすでにインストールされている場合は、この手順をスキップしてください。

デフォルトのUbuntuリポジトリにないHAProxy1.6をインストールします。 ただし、PPAを使用する場合は、次のコマンドを使用して、パッケージマネージャーを使用してHAProxy1.6をインストールできます。

  1. sudo add-apt-repository ppa:vbernat/haproxy-1.6

ロードバランサーのローカルパッケージインデックスを更新し、次のように入力してHAProxyをインストールします。

  1. sudo apt-get update
  2. sudo apt-get install haproxy

これでHAProxyがインストールされましたが、構成する必要があります。

ステップ4—HAProxyを設定する

このセクションでは、SSLセットアップを使用して基本的なHAProxyを構成する方法を示します。 また、Let’sEncrypt証明書を自動更新できるようにHAProxyを構成する方法についても説明します。

開ける haproxy.cfg テキストエディタの場合:

  1. sudo nano /etc/haproxy/haproxy.cfg

次のいくつかのセクションで編集するときは、このファイルを開いたままにしておきます。

グローバルセクション

下にいくつかの基本設定を追加しましょう global セクション。

最初に実行したいのは、maxconnを適切な数に設定することです。 これは、HAProxyが許可する同時接続の数に影響し、QoSに影響を与え、Webサーバーがクラッシュしてあまりにも多くの要求を処理しようとするのを防ぐことができます。 あなたの環境に何がうまくいくかを見つけるためにそれをいじくり回す必要があるでしょう。 global セクションに次の行(妥当と思われる値を含む)を追加します。

haproxy.cfg —1/7
   maxconn 2048

次に、この行を追加して、生成される一時DHEキーの最大サイズを構成します。

haproxy.cfg — 2/7
   tune.ssl.default-dh-param 2048

デフォルトセクション

defaultsセクションの下に次の行を追加します。

haproxy.cfg — 3/7
   option forwardfor
   option http-server-close

forwardforオプションは、HAProxyを追加するように設定します X-Forwarded-For 各リクエストのヘッダー、および http-server-close オプションは、接続を閉じながらキープアライブを維持することにより、HAProxyとユーザー間の遅延を減らします。

フロントエンドセクション

これで、定義する準備ができました frontend セクション。

最初に追加したいのは、着信HTTP接続を処理し、それらをデフォルトのバックエンド(後で定義します)に送信するフロントエンドです。 ファイルの最後に、www-httpというフロントエンドを追加しましょう。 必ず交換してください haproxy_public_IP HAProxyサーバーのパブリックIPアドレスを使用します。

haproxy.cfg —4/7
frontend www-http
   bind haproxy_www_public_IP:80
   reqadd X-Forwarded-Proto:\ http
   default_backend www-backend

次に、着信HTTPS接続を処理するためのフロントエンドを追加します。 ファイルの最後に、www-httpsというフロントエンドを追加します。 必ず交換してください haproxy_www_public_IP HAProxyサーバーのパブリックIPを使用します。 また、交換する必要があります example.com ドメイン名(以前に作成した証明書ファイルに対応している必要があります):

haproxy.cfg —5/7
frontend www-https
   bind haproxy_www_public_IP:443 ssl crt /etc/haproxy/certs/example.com.pem
   reqadd X-Forwarded-Proto:\ https
   acl letsencrypt-acl path_beg /.well-known/acme-challenge/
   use_backend letsencrypt-backend if letsencrypt-acl
   default_backend www-backend

このフロントエンドはACLを使用します(letsencrypt-acl)Let’s Encryptの検証リクエストを送信します( /.well-known/acme-challenge)に letsencrypt-backend バックエンド。これにより、HAProxyサービスを停止せずに証明書を更新できるようになります。 他のすべてのリクエストはに転送されます www-backend、これは、Webアプリケーションまたはサイトにサービスを提供するバックエンドです。

バックエンドセクション

フロントエンドの構成が完了したら、 www-backend 次の行を追加してバックエンド。 強調表示された単語を、WebサーバーのそれぞれのプライベートIPアドレスに置き換えてください( server 所有しているバックエンドサーバーの数に一致する行):

haproxy.cfg —6/7
backend www-backend
   redirect scheme https if !{ ssl_fc }
   server www-1 www_1_private_IP:80 check
   server www-2 www_2_private_IP:80 check

このバックエンドが受信するトラフィックはすべて、 server HTTP経由のエントリ(ポート80)。

最後に、 letsencrypt-backend これらの行を追加することにより、バックエンド

haproxy.cfg —7/7
backend letsencrypt-backend
   server letsencrypt 127.0.0.1:54321

このバックエンドは、証明書の要求と更新に使用されるLet’s Encrypt ACMEチャレンジのみを処理し、ポート上のローカルホストにトラフィックを送信します 54321. 代わりにこのポートを使用します 80443 Let’sEncryptSSL証明書を更新するとき。

これで、HAProxyを開始する準備が整いました。

  1. sudo service haproxy restart

注:問題が発生した場合 haproxy.cfg 設定ファイルについては、 this GitHubGistで例を確認してください。

Let’s Encrypt TLS / SSL証明書が用意され、自動更新スクリプトを設定する準備が整いました。 この時点で、Webブラウザーでドメインにアクセスして、TLS/SSL証明書が機能することをテストする必要があります。

ステップ5—自動更新の設定

Let’s Encryptの証明書はわずか90日間有効なので、更新プロセスを自動化することが重要です。

証明書が古くならないようにするための実用的な方法は、更新プロセスを自動的に処理するcronジョブを作成することです。 cronジョブが実行されます certbot 有効期限が切れてから30日以内であれば、毎日証明書を更新してください。 certbot スペシャルも実行します renew-hook 更新が成功した後のスクリプト。 この更新スクリプトを使用して、結合されたものを更新します .pem ファイルを作成し、haproxyをリロードします。

今すぐそのスクリプトを作成して、テストしてみましょう。

更新スクリプトを作成する

で新しいファイルを開きます /usr/local/bin root として:

  1. sudo nano /usr/local/bin/renew.sh

これは新しい空白のテキストファイルになります。 次の短いスクリプトを貼り付けます。強調表示されたドメイン名を自分のドメイン名で更新してください。

#!/bin/sh

SITE=example.com

# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE

# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem

# reload haproxy
service haproxy reload

ファイルを保存して閉じます。 このスクリプトは正しいLet’sEncryptディレクトリに移動し、 cat 2つを連結するコマンド .pem ファイルを1つにまとめてから、haproxyをリロードします。

次に、スクリプトを実行可能にします。

  1. sudo chmod u+x /usr/local/bin/renew.sh

次に、スクリプトを実行します。

  1. sudo /usr/local/bin/renew.sh

エラーなしで実行されるはずです。 haproxyのリロードに関する出力が表示されます。 次に、Certbotを更新し、この更新スクリプトを実行するように構成します。

certbot構成を更新します

The certbot renew 証明書を更新するために使用するコマンドは、最初に実行したときに作成された構成ファイルを読み取ります certbot. このファイルを開いて、ポートを更新する必要があります certbot はスタンドアロンのhttpサーバーを実行するために使用するため、haproxy(ポート80および443ですでにリッスンしている)と競合しません。 テキストエディタで設定ファイルを開きます。

  1. sudo nano /etc/letsencrypt/renewal/example.com.conf

変更する必要があります http01_port 行なので、次のようになります。

example.com.conf
http01_port = 54321

ファイルを保存して閉じます。 次に、更新プロセスをテストし、次のように指定します --dry-run したがって、実際には何も更新しません。

  1. sudo certbot renew --dry-run

Certbotはポート54321で更新チャレンジをリッスンし、haproxyはポート80から54321へのリクエストをプロキシします。

cronジョブを作成する

次に、crontabを編集して、を実行する新しいジョブを作成します。 certbot renew 毎日コマンド。 rootユーザーのcrontabを編集するには、次のコマンドを実行します。

  1. sudo crontab -e

ファイルの最後に以下を追加します。

crontabエントリ
30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log

保存して終了。 これにより、を実行する新しいcronジョブが作成されます。 certbot renew 毎日午前2時30分に命令します。 コマンドによって生成された出力は、次の場所にあるログファイルにパイプされます。 /var/log/le-renewal.log. 証明書が実際に更新された場合、 --renew-hook スクリプトが実行され、結合されたPEMファイルが作成されてリロードされます haproxy.

結論

それでおしまい! HAProxyは現在、無料のLet’s Encrypt TLS / SSL証明書を使用して、HTTPSトラフィックを安全に処理しています。