この記事では、独自ドメインサイトのSSL化(HTTPS化)と、Letsencrypt証明書更新の自動化の方法について紹介します。
設定を行う環境はUbuntu,Nginxで、Letsencryptのサーバー証明書を利用する方法となります。
また、当記事で紹介するNginxのエントリーファイルは、他記事で紹介しているwordpressの環境構築をベースとしています。
詳しくはこちらの記事を参考にしてください。
2020年4月にUbuntu 20.04 LTSがリリースされました。 LTS版でもあるため、導入しやすく今後wordpressの環境構築用のサーバーとしての利用も増えそうです。 今回は、[…]
また、実際の動作確認には、予め独自ドメインを取得しておく必要があります。
◆動作検証環境
・ローカル環境:mac Catalina
・さくらVPSサーバー:メモリ 512M, ストレージ:SSD 25GB, CPU:1コア
・OS:Ubuntu 20.04 LTS(Focal Fossa) amd64
・Nginx:1.18.0
・mysql Ver 15.1 Distrib 10.3.22-MariaDB
・PHP:7.4.11
・wordpress:5.5.1
LetsencryptのインストールとSSL/TLS サーバ証明書の取得
独自ドメインでサイトのSSL化(HTTPS化)するリモートサーバーで作業します。
letsencryptをインストール
1 2 3 | $ sudo apt-get install letsencrypt |
SSL/TLS サーバ証明書の取得
letsencryptがport80を使用するので、一旦nginxを停止する。
1 2 3 | $ sudo systemctl stop nginx |
証明書を取得
1 2 3 | $ sudo letsencrypt certonly --standalone -d mydomainname.com |
nginxエントリーファイルの設定
1 2 3 | $ cd /etc/nginx/sites-available |
wordpress.conf はそれぞれの環境に合わせて変更します。
すでに、エントリーファイルがある場合はそちらを指定。
これから作成する場合は、任意にファイル名を指定
1 2 3 | $ sudo vim wordpress.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # http wwwなしからのリダイレクト server { listen 80; listen [::]:80; server_name mydomainname.com: return 301 https://$host$request_uri; } # http https wwwありからのリダイレクト server { listen 80; listen 443 ssl; server_name www.mydomainname.com; ssl_certificate /etc/letsencrypt/live/mydomainname.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomainname.com/privkey.pem; return 301 https://mydomainname.com$request_uri; } # リダイレクトを流される側の設定 server { listen 443 ssl default_server; server_name mydomainname.com; ssl on; ssl_certificate /etc/letsencrypt/live/mydomainname.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomainname.com/privkey.pem; root /var/www/wordpress; index index.html index.htm index.nginx-debian.html index.php; location / { try_files $uri $uri/ /index.php?args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } } |
すでにエントリーファイルのリンクを貼っている場合は、既存のファイルを削除
1 2 3 | $ sudo rm /etc/nginx/sites-enabled/wordpress.conf |
作成したエントリーファイルにリンクを新しいサイトに貼る
1 2 3 | $ sudo ln -s /etc/nginx/sites-available/wordpress.conf /etc/nginx/sites-enabled/ |
Nginxを再起動
1 2 3 | $ sudo systemctl restart nginx.service |
ブラウザを立ち上げて、https でのアクセス、http アクセス、www 付きアドレスからのアクセス時のリダイレクトを確認する。
Letsencrypt証明書更新の自動化
Letsencryptでの証明書取得は無料で行なえますが、3ヶ月ごとに更新をする必要があります。
そのためcrontabによる更新の自動化を行います。
crontabの編集
1 2 3 | $ sudo crontab -e |
下記のような表示が出たら、お好みのエディターの形式を選択。
1 2 3 4 5 6 7 8 9 10 11 | no crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]: |
ファイル内に下記の内容を追加
*この場合は、毎月1日5時にnginxの停止、letsencrypt証明書の更新、nginnxの開始を行う
1 2 3 | 00 05 01 * * sudo systemctl stop nginx; sudo letsencrypt renew; sudo systemctl start nginx |
1 2 3 | $ sudo service nginx restart |
Letsencrypt証明書更新の自動化がうまくいっていない時の対応
Letsencryptからの警告メール
自動更新の設定を行っても、何だかの理由で更新がうまく行われていない場合(サーバーの移転等を行った場合に起こりやすい)、Let’s Encryptより警告のメールが届きます。
タイトルは
Let’s Encrypt certificate expiration notice for domain “sample.com”
となり、
証明書の期限が切れる19日前、10日前に届きます。
10日前に届く場合は以下のような内容となります。
Hello,
Your certificate (or certificates) for the names listed below will expire in 10 days (on 08 Jun 21 17:04 +0000). Please make sure to renew your certificate before then, or visitors to your web site will encounter errors.
We recommend renewing certificates automatically when they have a third of their total lifetime left. For Let’s Encrypt’s current 90-day certificates, that means renewing 30 days before expiration. See https://letsencrypt.org/docs/i
ntegration-guide/ for details. sample.com
For any questions or support, please visit: https://community.letsencrypt.
org/ Unfortunately, we can’t provide support by email. For details about when we send these emails, please visit: https://letsencrypt.org/docs/e
xpiration-emails/ In particular, note that this reminder email is still sent if you’ve obtained a slightly different certificate by adding or removing names. If you’ve replaced this certificate with a newer one that covers more or fewer names than the list above, you may be able to ignore this message. 以下省略
更新期限の確認
以下のコマンドを実行します
sudo certbot certificates
期限が切れる日時(Expiry Date:)が表示されるので確認します。
1 2 3 4 5 6 7 8 9 10 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Found the following certs: Certificate Name: sample.com Domains: sample.com www.sample.com Expiry Date: 2021-08-27 17:02:47+00:00 (VALID: 89 days) Certificate Path: /etc/letsencrypt/live/sample.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/sample.com/privkey.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
期限更新不具合の対応
上記の確認作業で、警告メールのとおり期限が19日前や、10日前となっている場合は、自動更新がうまく行われていないため対策が必要です。
手動で更新ができるか確認
現在が設定で更新ができる状態か確認できるコマンドがあるので、まずはテストをしてこちらを実行します。
$ sudo certbot renew --dry-run
以下のように表示されれば更新が可能な状態となっていますので、$ sudo certbot renew を行い更新します。
1 2 3 4 5 6 7 8 9 10 11 12 | 中略 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** 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/sample.com/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
エラーの表示が出る場合は、対応を行います。
エラーログは、/var/log/letsencrypt/letsencrypt.log に残ります。
今回のエラー内容は以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/sample.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Attempting to parse the version 1.0.0 renewal configuration file found at /etc/letsencrypt/renewal/tomato-power.com.conf with version 0.40.0 of Certbot. This might not work. Cert is due for renewal, auto-renewing... Could not choose appropriate plugin: The requested apache plugin does not appear to be installed Attempting to renew cert (sample.com) from /etc/letsencrypt/renewal/sample.com.conf produced an unexpected error: The requested apache plugin does not appear to be installed. Skipping. All renewal attempts failed. The following certs could not be renewed: /etc/letsencrypt/live/sample.com/fullchain.pem (failure) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
an unexpected error: The requested apache plugin does not appear to be installed. Skipping.
こちらに対応するために、まずはNginxのアップデートをためしてみます。
$ sudo apt-get update
テスト更新を試して、エラーが続くようであれば、プラグインをインストールします。
1 2 3 | $ sudo apt-get install python3-certbot-nginx |
テスト更新を試して、エラーが続くようであれば、Firewallの設定を確認します。
$ sudo ufw status以下のようにNginxの権限がない場合は、
1 2 3 4 5 6 7 8 9 10 11 12 | Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 80 ALLOW Anywhere 443 ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) |
以下のコマンドを実行します。
$ sudo ufw allow 'Nginx Full'
テスト更新を試して、エラーが続くようであれば、Nginxのプラグインの設定を行います。
$ sudo certbot --nginx -d sample.com -d www.sample.com
すでに証明証がある場合は以下の表示になるのでExpand
を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - You have an existing certificate that contains a portion of the domains you requested (ref: /etc/letsencrypt/renewal/sample.com.conf) It contains these names: sample.com You requested these names for the new certificate: sample.com, www.sampler.com. Do you want to expand and replace this existing certificate with the new certificate? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (E)xpand/(C)ancel: e |
その後に以下の表示となるので、
1 2 3 4 5 6 7 8 9 10 | Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): |
リダイレクトの設定方法を選択します。
更新が完了すると以下の表示となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Your existing certificate has been successfully renewed, and the new certificate has been installed. The new certificate covers the following domains: https://sampler.com and https://www.sample.com You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=sample.com https://www.ssllabs.com/ssltest/analyze.html?d=www.sample.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/sample.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/sample.com/privkey.pem Your cert will expire on 2021-08-27. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
念の為、もう一度$ sudo certbot renew --dry-run を行い、その後$ sudo certbot renew で手動更新を行います。
以上、独自ドメインサイトのSSL化(HTTPS化)と、Letsencrypt証明書更新の自動化の方法について紹介しました。