Let’s Encrypt で証明書を発行して運用するための nginx の設定

この記事では Let’s Encrypt で証明書を発行し, nginx で利用するための設定を紹介します. Nginx をアプリケーションサーバーのためのプロキシとして利用している場合を想定して, Let’s Encrypt のための webroot を別に設定しています.

概要

Let’s Encrypt では様々な方法での認証・証明書のインストール方法がプラグインとして提供されています. Nginx 用のプラグインも開発されていますが, 現時点で experimental となっているようなので, webroot プラグインを利用するのが一般的なようです.

この記事では /var/www/letsencrypt に Let’s Encrypt の webroot プラグインによる認証のためのディレクトリを作成し, 以下のようなコマンドで証明書の発行を行えるようにすることを目標とします.

./letsencrypt-auto certonly --webroot --webroot-path /var/www/letsencrypt -d example.com

認証のためのディレクトリを分けることで, 既存の nginx の設定の root による影響を回避することが出来ます.

初めて HTTPS 証明書を発行する場合

初めて HTTPS 証明書を発行する場合, http://<domain>/.well-known/acme-challenge/ にアクセスすることで認証を行います. ここでは webroot/var/www/letsencrypt に作成するものとします.

以下の設定では, /.well-known/acme-challenge/ 以下へのアクセスの root/var/www/letsencrypt に設定しています. また /.well-known/acme-challenge/ にアクセスがあった場合 403 が返ることを防ぐために, /.well-known/acme-challenge/ へのアクセスには 404 を返しています.

server {
    listen 80;
    listen [::]:80;

    server_name example.com;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    location = /.well-known/acme-challenge/ {
        return 404;
    }

    # 既存の設定をここに
}

HTTPS の運用を開始した後の設定

Let’s Encrypt で発行した証明書を用いて運用を開始した後も, 定期的に証明書の更新が必要です. HTTP/HTTPS 両対応のサイトを運用する場合は, 先ほどの設定で運用を継続できますが, HTTP でのアクセスを HTTPS へリダイレクトするようなサイトの場合は, 設定の変更が必要です.

証明書更新のための認証も http://<domain>/.well-known/acme-challenge/ へアクセスすることによって行なわれます. この URL へのアクセスが HTTPS の URL へリダイレクトされる場合は, Let’s Encrypt の認証サーバーは自動的に HTTPS の URL にアクセスしてくれます. このため, HTTPS へ全てのアクセスをリダイレクトする場合, 認証のための設定は HTTPS 側に記述します.

server {
    listen 80;
    listen [::]:80;

    server_name example.com;

    # HTTP へのアクセスは全て HTTPS へリダイレクト
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name example.com;

    # 証明書チェーン
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    # 自身の証明書を除いた証明書チェーン (OCSP 対応用)
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    # 秘密鍵
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;

    ssl_dhparam /etc/nginx/ssl/dhparam_2048.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'お好みで';
    ssl_prefer_server_ciphers on;

    # お好みで
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP 対応
    ssl_stapling on;
    ssl_stapling_verify on;

    resolver 8.8.8.8 8.8.4.4;

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
    }

    location = /.well-known/acme-challenge/ {
        return 404;
    }

    # 既存の設定をここに
}

参考