投稿日: | 最終更新日:
Let’s Encryptで発行した証明書を自動更新する
ConoHaVPSにLet’s Encryptで発行した証明書を自動更新設定します。
3か月に一回
Let’s Encryptの認証局が発行する SSL/TLS サーバ証明書は無料ですが、有効期限が3か月(90日間)です。つまり、この周期で自動更新設定を行います。
作業の流れ
- 証明書の更新テストを行います。
- cronに定期的に証明書を自動更新するよう設定します。
前提条件
今回の作業を行うにあたり、以下の前提条件を満たしているとします。
- すでにDjango サイトが動いている状態
- すでにDjangoプロジェクトの静的ファイル設置場所を指定している
- Web サーバに Apache を使っていること
- Let’s Encryptで証明書が発行できていること
準備
以下の準備を行います。
ConoHaVPSの準備
①ConoHaをレンタルします。
②ConoHaにroot以外のユーザを作ります。
③ConoHaにSSH接続するための設定を行います。
④ConoHaへのrootログインを禁止します。
⑤ConoHaのportを22から変更します。
⑥ConoHaVPSへApacheをインストールしてスタートページを表示します。
Python・Djangoの準備
①ConoHaVPSへPython3をインストールします。
②ConoHaVPSへPython3をインストールします。
③ConoHaVPSへWSGIをインストールします。
→ConoHaのVPSにApacheでPythonWebアプリを作る(WSGI)
④ConoHaVPSへDjangoをインストールします。
⑤Djangoのデータベース接続・初期化します。
⑥Djangoのプロジェクトにアプリケーションを作成します。
Apache・Webサーバサイドの準備
①Let’s Encryptで証明書を発行します。
→Djnago+ApacheサーバにLet’s Encryptで証明書を発行する
②Let’s Encryptで証明書をApacheに設定します。
必要なもの
レンタルサーバ | 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
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1