CentOS7 + nginx + Let’s Encryptでhttp/2対応SSL化

概要

Let’s Encryptを使用して無料の証明書を取得し、http/2対応 SSL化を行う。

前提条件

certbotで証明書を取得したい場合、以下の設定が完了している必要があります。

  • nginxがセットアップ済み
  • 証明書を取得したいドメインと、そのDNS設定が完了している

※nginxがなくてもcertbotのStandaloneプラグインで証明書の取得は可能ですが、今回はnginx経由でDV認証を行います。

epelのインストール

epelリポジトリからcertbotをインストール出来ます。

まずは標準リポジトリからepelをインストール。

# yum install -y epel-release

certbotのインストール

続いてLet’s Encryptクライアントのcertbotをインストールします。

# yum install -y certbot

SSL証明書取得

インストールしたcertbotを使用し、nginx経由でDV認証を行います。

以下はexample.comで有効な証明書を取得する例です。example.comの所は取得したいコモンネームに置き換えてください。

-wで指定している所も有効なdocumentrootに置き換えてください。

# certbot certonly --webroot -w /usr/share/nginx/html -d example.com

certbotの初回実行時に規約同意やemailアドレスの入力等を行う必要があるので適時入力。

マルチドメイン(SANs)証明書を取得したい場合は、-dで渡しているコモンネームを複数渡してください。

# certbot certonly --webroot -w /usr/share/nginx/html -d example.com -d www.example.com

この場合はexample.comとwww.example.comが有効な証明書が取得できます。

各コモンネーム全てにDV認証が行われるので、取得したいコモンネーム全てのDNS設定が完了している必要があります。

DV認証に成功すると以下の場所に証明書、中間証明書、秘密鍵が生成されます。

/etc/letsencrypt/live/example.com

生成されるファイルは以下

  • cert.pem (SSL/TLSサーバ証明書)
  • chain.pem (中間証明書)
  • fullchain.pem (SSL/TLSサーバ証明書 + 中間証明書)
  • privkey.pem (秘密鍵)

nginxで使用するのはfullchain.pemとprivkey.pemです。

SSL証明書のインストール

取得した証明書をnginxに設定します。

nginxのserverディレクティブは以下の様になります。

server {
    listen  443 http2;
    ssl on;
    server_name  example.com;
    index index.html;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

}

環境に合わせて適時置き換えてください。

その後nginxをreloadします。

syntaxチェック

# nginx -t

nginxをreload

# systemctl reload nginx

証明書が有効になっているかウェブブラウザでアクセスし、確認します。

問題なければ証明書の自動更新設定を行います。

SSL証明書の自動更新設定

Let’s EncryptのSSL証明書有効期限は3ヶ月なので、自動更新設定をしておかないといつの間にか期限が切れている事があるため自動更新設定を行います。

更新はcertbotのrenewコマンドで行います。

renewコマンドは取得済み証明書の有効期限が30日未満の場合、更新されます。

# certbot renew

このコマンドだけで証明書は更新されますが、nginxが新しい証明書を読み込み直す必要があるため、証明書更新が行われたときのみ実行されるオプション –post-hookを使用して自動更新を行います。

# certbot renew --post-hook "systemctl reload nginx"

あとはこのコマンドをcronで定期的に実行する事で、自動更新が行えます。

以下の例では毎日12時に証明書の更新チェックを行っています。

0 12 * * * certbot renew --post-hook "systemctl reload nginx"

以上で設定は完了です。