いままでワイルドカードで便利な激安証明書を使っていたのだが、安さは正義なので無料なLet’s Encryptに移行した。企業サイトなのだけれどOV/EVは技術的要件ではないので要らない。ドメイン認証(DV)証明書で十分ということで。

  • 環境
    ** CentOS 7.2 x64
    ** Nginx 1.8.1
    ** Let’s Encrypt 0.8.1

  • Nginx のディレクトリ構成

    • 設定ファイル群: /etc/nginx/
    • バーチャルホスト設定ファイル: /etc/nginx/vhosts/{FQDN}.conf
      • 非SSL/SSLの両プロトコルが同一ファイルに書かれている
    • SSL設定ファイル群: /etc/nginx/ssl/
    • 全体のドキュメントルート: /var/www-nginx/
  • Let’s Encrypt向けディレクトリ構成
    • 設定ファイル群: /etc/letsencrypt/
    • Let’s Encryptインストール先: /opt/letsencrypt
    • ACME通信用ドキュメントルート: /var/www-nginx/letsencrypt/{FQDN}/

で、以下のような bash手順で導入していく。変数は環境に応じて見直すこと。途中で letsencrypt-auto を無意味に呼び出しているのは、必要なOSパッケージ類をさっさとインストールさせるため。

Let’s EncryptでSSL対応化するバーチャルホスト設定ファイルに対して、ACME通信用の設定を追加する。最後から3行目の sed は「listen 80; の行のあとに設定を追加する」という意味なので、適宜修正する。

証明書を取得する。質問には適当に答える。

証明書が取得できたとする。SSL対応化するバーチャルホスト設定ファイルに証明書読み込み設定を追加する。こちらの sedkeepalive_timeout 行の前に挿入するように書かれているので適宜修正。なお、Nginx の ssl_certificate$host 変数は使えない(設定ファイル読み込み時に展開しようとしても中身ないからね)。

/etc/nginx/ssl/ssl-letsencrypt.conf は SSL化の共通ファイル。このとおりに設定すると QUALYS SSL LABS のテストで A+ になるはず。

これで、

すれば、ぶじLet’s EncryptによるSSL化完了。

ただし、Let’s Encryptの証明書は90日で期限が切れる。したがってある程度のスパンで自動更新をしなければいけない。といっても一日に何回も更新するとはねられるので、cron.daily くらいで。

こんな感じで cron をしかけると一日に一回リニューアルにチャレンジし、失敗すると ADMIN_ADDR にメールが飛ぶはず。

完了! 無料証明書おいしいです!

はまりどころ:

  • .well-known/acme-challenge ディレクトリをあらかじめ掘ってあるとスクリプトがご丁寧にハネてくれる。まあ、ふつうか…
  • /etc/nginx/ssl/dhparam.pem って、ふつうデフォルトでは存在しないよね? あと生成に時間がかかるとかいうからみがまえてたら、Sくらでも1分かからずに終わった

ちなみに bash で手順記録しているのは、ぼくのところではプロビジョニングツールが bash だからです…。