ホーム >  VPS >  Let’s Encryptで発行した証明書を自動更新する

投稿日:   |  最終更新日:

Let’s Encryptで発行した証明書を自動更新する

VPS

ConoHaVPSにLet’s Encryptで発行した証明書を自動更新設定します。

3か月に一回

Let’s Encryptの認証局が発行する SSL/TLS サーバ証明書は無料ですが、有効期限が3か月(90日間)です。つまり、この周期で自動更新設定を行います。

作業の流れ

  • 証明書の更新テストを行います。
  • cronに定期的に証明書を自動更新するよう設定します。

前提条件

今回の作業を行うにあたり、以下の前提条件を満たしているとします。

  • すでにDjango サイトが動いている状態
  • すでにDjangoプロジェクトの静的ファイル設置場所を指定している
  • Web サーバに Apache を使っていること
  • Let’s Encryptで証明書が発行できていること

準備

以下の準備を行います。

ConoHaVPSの準備

①ConoHaをレンタルします。

ConoHaVPSをレンタルしてみる

②ConoHaにroot以外のユーザを作ります。

ConoHaのroot以外のユーザを作る

③ConoHaにSSH接続するための設定を行います。

ConoHaのSSH接続

④ConoHaへのrootログインを禁止します。

rootからのログインを禁止

⑤ConoHaのportを22から変更します。

SSH接続するportを22から変更

⑥ConoHaVPSへApacheをインストールしてスタートページを表示します。

ConoHaのVPSにApacheインストール

Python・Djangoの準備

①ConoHaVPSへPython3をインストールします。

ConoHaのVPSにPython3環境を作る

②ConoHaVPSへPython3をインストールします。

ConoHaのVPSにPython3環境を作る

③ConoHaVPSへWSGIをインストールします。

ConoHaのVPSにApacheでPythonWebアプリを作る(WSGI)

④ConoHaVPSへDjangoをインストールします。

ConoHaのVPSにDjango環境を作る

⑤Djangoのデータベース接続・初期化します。

ConoHaでDjangoのデータベース接続・初期化

⑥Djangoのプロジェクトにアプリケーションを作成します。

ConoHaでDjangoのアプリケーション作成

Apache・Webサーバサイドの準備

①Let’s Encryptで証明書を発行します。

Djnago+ApacheサーバにLet’s Encryptで証明書を発行する

②Let’s Encryptで証明書をApacheに設定します。

Djnago+Apacheサーバにhttpsを設定する

必要なもの

レンタルサーバ ConoHaのVPSサーバ
独自ドメイン ムームードメインで、独自ドメインのみ取得。2年契約で(2,000〜3,000円)くらい?

ConoHaVPSの環境

アプリケーションサーバ OS CentOS7.4
Apache 2.4.6 (CentOS)
Python 3.6.4
mod-wsgi 4.5.24
Django 2.0.2
mysqlclient 1.3.12
PyMySQL 0.8.0

クライアントPC

操作開発用のクライアントPCを用意します。windowsでもmacでも可能ですが、今回はubuntuを利用します。

OS Ubuntu 16.04.1 LTS 64bit

証明書の更新テスト

前回は、certbotでLet’s Encryptの証明書を取得しました。今回もcertbotコマンドを使って更新設定します。また、実際に更新設定する前にcertbotを利用して更新テストを行います。

①VPSにログインします。

前回作った仮想環境を起動します。

cd
. test_django/bin/activate

③Certbotを利用するので、root権限にログインします。

su -

④更新テスト用のコマンドを実行します。

certbot renew --force-renew --dry-run --webroot-path /var/www/cgi-bin/test_django/ --post-hook "systemctl reload httpd"
renew 証明書を更新します。
–force-renew 証明書の有効期限の残りを無視して、過去に発行したすべての証明書を強制的に更新することができます。ただし、すべての証明書の強制更新を毎日行うことは適切ではありません。Let’s Encrypt 認証局のレート制限に引っ掛かり更新できなくなってしまうことがあります。
–dry-run テスト用オプション、実際に更新は行いません。
–post-hook POST_HOOK 証明書を取得・更新する試みが終わった後にシェルで実行するコマンドを指定します。更新された証明書を配備する目的や、–pre-hook で終了したサービスを起動する目的で使用できます。これは、証明書を取得・更新が行われた場合のみ実行されます。

「certbot renew」コマンドを実行すると、過去に取得した証明書のうち、有効期間の残りが30日未満の証明書が更新されます。更新の際には、プラグインやオプションを明示的に指定した場合を除き、証明書を発行した際に使用したプラグインとオプションが使用されます。

以下のような結果が表示されます。

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/独自ドメイン名.conf
-------------------------------------------------------------------------------
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-staging.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for www.drone-ctrl-traffic.net
Using the webroot path /var/www/cgi-bin/test_django for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Unable to clean up challenge directory /var/www/cgi-bin/test_django/.well-known/acme-challenge

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/www.drone-ctrl-traffic.net/fullchain.pem
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/www.drone-ctrl-traffic.net/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
---------------------------------------------------------------------

「Unable to clean up challenge directory(チャレンジディレクトリをクリーンアップできません)」とありますが、「Congratulations, all renewals succeeded. The following certs have been renewed:(おめでとう、すべての更新が成功しました。以下の証明書が更新されました)」と出ていますので問題なさそうです。

※dryrunなので実際に証明書更新は行いません。

cronによる証明書の自動更新

①cronが動いているか確認します。

systemctl status crond

以下のような結果が表示されます。「active」と表示されていればOKです。

● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-02-15 08:34:39 JST; 3 weeks 1 days ago
 Main PID: xxxx (crond)
   CGroup: /system.slice/crond.service
           └─xxxx /usr/sbin/crond -n

②crontab(クローンコマンド)の現状の設定の確認します。

crontab -l

以下のような結果が表示されます。root権限では、現状何も設定されていないことが分かります。

no crontab for root

③crontabを設定します。

crontab -e

以下のコマンドを記述します。

00 04 01 * * root /bin/certbot renew --webroot-path /var/www/cgi-bin/test_django/ --post-hook "systemctl reload httpd"

※毎月の1日、04時00分に更新を実行します。

クローンが実行できたか確認するには、以下のコマンドを入力します。

tail /var/log/cron

certbotのクローン実行のみ確認したい場合は以下のコマンドを入力します。

cat /var/log/cron |grep certbot
トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告