Let's Encrypt 証明書をサーバー無停止で新規発行する(Nginx編)

先日、WordPress環境向けに Let’s Encrypt 証明書の適用を試みました。

そこでは Standalone プラグイン(現在稼働中のHTTPサービスを一度停止して証明書を発行する方法)を主に試しましたが、ここでは Webroot プラグイン(現在稼働中のHTTPサービスは継続したまま新規に発行する)方法を試みます。

https://fand.jp/entry/2016/04/17/started-letsencrypt-ssl/
https://fand.jp/entry/2016/04/17/started-letsencrypt-ssl/
https://fand.jp/entry/2016/04/17/started-letsencrypt-ssl/
404 Not Found: ページが存在していません

Let’s Encrypt 証明書作成の準備をする (Nginx環境)

前回記事でも “webrootの仕組み” として少し記載しました。

/path/to/doc_root/ で設定した部分に、スクリプトが /.well-known/acme-challenge/xxxxxx (←ランダム文字) という構造でファイルを作成し認証しているようです。従って、WordPressをリバースプロキシしているnginxに対しては、以下のコンフィグを適用する必要があります。

ですので、Let’s Encrypt スクリプトがアクセスするためのパスを以下の通り定義します。

    server_name example.com;

    ...(中略…各自のコンフィグ)...

    location ^~ /.well-known/acme-challenge {
        root /path/to/doc_root/;
    }
  • 新規発行したいドメインの VirtualHost 設定に適用します。ここでは、example.com に適用するイメージを記載しています。
  • /path/to/doc/root/ 部分は何でも構いません。用途が限定的なので、現在稼働しているサービスに依存しない場所へ新規作成したほうが運用しやすいと個人的には思います。別の新規ドメイン作成時にも同じものが流用できるので。
  • パーミッションは、Webページが表示できる最低限のレベルで問題ありません(スクリプト実行時には結局、rootでランダム文字のディレクトリが生成されるため)。

Let’s Encrypt 証明書を作成する

証明書の作成コマンドを実行する

  • 作成したいドメイン名「YOUR_DOMAIN」部分に置き換えて記載してください
  • /path/to/doc_root 部分は、Let’s Encrypt 証明書作成の準備をする で設定したスクリプト用の公開パスです
$ ./letsencrypt-auto certonly --webroot -w /path/to/doc_root -d YOUR_DOMAIN

Checking for new version...
Requesting root privileges to run letsencrypt...
[sudo] password for username_xxxxx:

認証実行時の Let’s Encrypt サーバーからのアクセス(1リクエスト)

66.133.109.36 "GET /.well-known/acme-challenge/xxYYzzLSkLeS4sSin_KLhyyyyyyyyyyo7xxxxxxxxxx HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

なお、今回実行時のIPアドレスは上記のとおりでしたが、Let’s Encrypt 総合ポータル よくある質問(リンク切れ) にある通りIPアドレスのリストは随時変更される可能性があるため公開されていません。保証できませんということですね。

Let’s Encrypt が認証時に使用するIPアドレスは何ですか?

Let's Encrypt では、サーバの認証(ドメイン・サブドメイン使用権者の認証のためのWebサーバへの接続)に使用するIPアドレスのリストを公開していません。これは、使用されるIPアドレスが随時変更される可能性があるためです。
また、将来的には、一回の認証プロセスにおいて、複数のIPアドレスから接続するようになるかもしれません。

証明書作結果(成功)

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem. Your cert will
   expire on 2016-08-06. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.

  • YOUR_DOMAIN 部分は、d オプションで指定したドメインが記載されます。
  • expire 部分には、証明書の有効期間=発行日から3ヶ月後の月日が記載されます。

証明書の作成ディレクトリを確認してみます。

$ sudo ls -al /etc/letsencrypt/live/

drwx------ 4 root root 4096 May  8 15:30 .
drwxr-xr-x 8 root root 4096 Apr 13 22:31 ..
drwxr-xr-x 2 root root 4096 Apr 17 15:56 DOMAIN1     (←以前作成したもの)
drwxr-xr-x 2 root root 4096 May  8 15:30 YOUR_DOMAIN (←今回作成したもの)

無事作成されました。

自動更新の設定

Let’s Encrypt 証明書の有効期間は発行日から3ヶ月後で短いため、cron による自動更新が推奨されています。

letsencrypt-auto renew コマンドを実行するだけで、新規発行時に作成されたコンフィグを用いてうまいこと更新してくれるようで、既にスクリプトも仕込んであるのですが、まだ更新時期に突入したことがないので成否の確証がとれていません…。

ですので結果はおって更新したいと思います。

まとめ

以上、サーバーのダウンタイム無しで特定 VirtualHost 向けの証明書を作成する手順でした。

なお、今回 Let’s Encrypt スクリプト群を git pull したところ、わずか数週間でいろいろファイル郡が更新されていました。nginx 向けの更新簡易化スクリプトがもしかしたら安定利用できる状態になっているかもしれませんが、その辺の最新状況をウォッチできていないため、本記事では汎用的な方法で行いました。

(最初に Let’s Encrypt を試した時は、Nginx向けの簡易化プラグイン?は非推奨になっていました)