【CentOS8】Nginxで「Let’s Encrypt」を利用し無料でSSL化する方法

Webサイトを無料でSSL化(https)する場合は「Let’s Encrypt」を使用します。
今回はNginxで作成したWebサイトへ「Let’s Encrypt」で取得したサーバー証明書を設定する手順をまとめます。

無料SSL「Let’s Encrypt」を導入と設定手順

まず事前準備として、以下が確認できることが必要となります。

  • 該当のドメインが名前解決ができ、Webサイトが表示されること
  • 80番ポートへのアクセスが可能なこと

次に以下でLet’s Encrypt のクライアントの「certbot」をインストールします。

インストール先の「/user/local」配下へ移動。
※ここでは任意のディレクトリであればどこでも問題ないです。

$ cd /usr/local

gitコマンドで「cerbot」をインストール
gitコマンドがない場合は、yumインストールで入れておくこと

$ git clone https://github.com/certbot/certbot

インストール後、certbotというディレクトリが作成されるので、ディレクトリ配下へ移動します。

$ cd certbot

以下のヘルプコマンドを実行し、ヘルプコマンドの一覧が表示されれば完了です。

$ ./certbot-auto --help

証明書の取得は「Nginx」を停止し、実行する

「cerbot-auto」コマンドで証明書を取得する際、Nginxが起動しているとエラーになり証明書が取得できません。
そのため、事前にNginxサービスは停止しておきます。

$ systemctl stop nginx

これは「Apache」も同様なので、Webサービスは事前に停止しておきます。

証明書の取得手順

証明書の取得はHTTPサーバーを立てることはないので「スタンドアローンモード」で実施します。

$ ./certbot-auto certonly --standalone -t

初回コマンド実行時は不足パッケージがインストールされます。
以下は、その後の手順となります。

$ ./certbot-auto certonly --standalone -t
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): text@gmail.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): test.engineers-life.com         

うまくいけば以下のように「Congratulations!」が表示されます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/engineers-life.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/engineers-life.com/privkey.pem
   Your cert will expire on 2020-08-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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

 - We were unable to subscribe you the EFF mailing list because your
   e-mail address appears to be invalid. You can try again later by
   visiting https://act.eff.org.

Nginxの設定

上記で成功後、certbotで取得した証明書は「/etc/letsencrypt/」配下に保存されます。
今回い、webサーバの設定で指定するのは「/etc/letsencrypt/live/該当ドメイン」以下にある証明書を利用します。

Nginxのファイルを設定します。

$ vim /etc/nginx/nginx.conf

nginx.confに以下の2行(5,6行目)を追加します。

    server {
        listen       443 ssl http2 default_server;

------中略ー-----
        ssl_certificate "/etc/letsencrypt/live/該当ドメイン/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/該当ドメイン/privkey.pem";
------中略ー-----
        }
    }
  • ssl_certificate:サーバ証明書と中間証明書が結合されている「fullchain.pem」のパスを指定
  • ssl_certificate_key:証明書と対の秘密鍵であるprivkey.pemのパスを指定

上記設定が完了したら、Nginxを起動します。

$ systemctl start nginx

上手くいけば以下のようにhttpsでアクセスでき、証明書も有効になっていることが確認できます。

証明書の自動更新

「Let’s Encrypt」で取得できる証明書は有効期限が3ヶ月と短い期間となっています。
そのため、定期的に証明書を更新する必要があります。

証明書を更新するために「certbot-auto」コマンドには「renew」というサブコマンドがあります。
以下は、実行例です。

$ ./certbot-auto renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/test.engineers-life.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/test.engineers-life.com/fullchain.pem expires on 2020-08-04 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

上記のように「renew」コマンドが上手くいくと更新されます。

更新後は一度nginxも再起動しておきます。

$ /bin/systemctl reload nginx

毎回手動でコマンドを実行するのはめんどくさいので「crontab」で1ヶ月ごとに上記コマンドを実行するようにします。
私は、以下のよに設定を十ッシしました。

設定

$ crontab -e
0 5 1 * * /usr/local/certbot/certbot-auto renew && /bin/systemctl reload nginx

設定確認

$ crontab -l
0 5 1 * * /usr/local/certbot/certbot-auto renew && /bin/systemctl reload nginx

毎月1日AM5:00に証明書を更新するcronを実施するようにしました。

以上でNginxのSSL化の設定手順となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!