2017年6月25日日曜日

リバプロNginxでもLet's Encrypt

経緯

QiNeelのSSL証明書が来月切れるんだっけ

とりあえず更新しとこう(過去記事参照

あれブラウザでアクセスしたら証明書エラーだぞΣ(゚д゚lll)

そういや以前StartCom(の親会社のWoSign)がやらかして、ルート証明書が無効化されたんだっけ

しゃーねーや他の認証局にすっか

そういやLet's Encryptってのがあったな

Nginxリバプロ構成の証明書取得方法を書いた記事があまりないな

しゃーねーや自分で調べっか

せっかくだから記事のネタにしよう


説明の前に

以下の作業はすべて、(取得したい証明書の)ドメインのAレコードに外部からアクセスした際の窓口となるサーバで行います。

基本的にはウェブサーバのことですが、リバースプロキシやロードバランサを使っているならそれが動いているサーバで行ってください。

AmazonのELBみたいにバランサ自体にログインできない場合は諦めてください。AWSなら無料の証明書が使えるみたいなのでそっち使ったほうがいいかも。

あと、この作業はUbuntu 14.04で確認しています(16.04じゃなかった)

準備

Certbotのインストール

まずはLet's EncryptのCertbotをインストール。
$ sudo wget https://dl.eff.org/certbot-auto -P /usr/local/bin
$ sudo chmod a+x /usr/local/bin/certbot-auto
$ certbot-auto

サーバ側の設定

ドメイン認証時には以下の作業がCertbotによって行われます。
  • 指定ドメインの /.well-known 以下に外部(Let's Encryptの認証サーバ)からアクセスが来る
  • そのため、あらかじめ認証データを用意しておく
リバプロ構成の場合は基本的にアクセスを別のサーバに割り振っているので、ここへのアクセスだけは自前で捌くように設定してあげないとダメです。

まずはcertbot用のワーキングディレクトリを作成。別にここじゃなくてもどこでもいいです。
$ sudo mkdir -p /var/www/letsencrypt

さらに /.well-known 以下へのアクセスを上記のワーキングディレクトリに割り当てる設定をします。
server {
    # Let's Encrypt
    location /.well-known {
        root /var/www/letsencrypt;
    }
    ...
}

最後にNginxをリロード
$ sudo service nginx reload

ドメイン認証&証明書発行

$ sudo certbot-auto certonly --webroot -w /var/www/letsencrypt -d DOMAIN
DOMAIN は証明書を発行したいドメインで。

連絡用のメアドを聞かれたり、利用許諾に同意しろって言われたりします。

無事に認証できると Congratulations! っていわれて、 /etc/letsencrypt 以下に証明書やら秘密鍵やらができます。

もう一度Nginxの設定

証明書と秘密鍵をNginxに設定してあげましょう。
server {
    ...
    ssl on;
    ssl_certificate     /etc/letsencrypt/live/DOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/DOMAIN/privkey.pem;
    ...
}
もう一度Nginxをリロード
$ sudo service nginx reload
HTTPSページにアクセスできていれば成功です!

更新

Let's Encryptの特徴は、証明書の更新が自動でできること。証明書の期限は90日と短いのですが、自動更新のおかげで気になりません。
というか自動更新できない他の証明書のほうが面倒なくらいです。

やり方は簡単で、cronで自動更新コマンドを設定するだけ。

$ crontab -e
のあとで
00 04 * * * certbot-auto renew --renew-hook "sudo service nginx reload" 1>/dev/null 2>/dev/null
これで毎日午前4時に取得したすべての証明書が自動更新されます

毎日実行して大丈夫なの?と心配するかもしれませんが、実際に更新されるのは期限が近い証明書だけなので無問題です。

証明書が更新されると --renew-hook で指定したコマンドが実行されるので、ここでNginxをリロードしておきます。
証明書が更新されなければリロードされません。

sudoの実行にパスワードを必須にしていると --renew-hook で毎回止まってしまうので、その場合はroot権限でcronを実行します。
ただしrootのホームディレクトリ内にcertbot用の設定がされている必要があるので、一度以下のコマンドを実行しておきます。
$ sudo su
# certbot-auto
横着して sudo certbot-auto だと、環境変数が引き継がれてしまって( USERHOME が元のユーザのままになっていて)うまくいかないときがあります。

0 件のコメント:

コメントを投稿