無料で常時SSL化(Nginx)

2021年4月19日

Webサイト(Nginx)の常時SSL化方法をご紹介します。HTTPではGoogle Chromeで警告が表示されるため、WebサイトのSSL化が必須となっています。Googleによると、WebページをSSL化しているかどうかでSEOにも影響があると書かれています。現在は証明書の品質は関係ない旨も記載されていますので、Webページをお持ちの方はSSL化することが重要です。そこで、無料で常時SSL化して、SSL証明書を定期的に自動更新する方法をご紹介します。

Let’s Encrypt

証明書は無料で手に入れることができます。それは、Let’s Encryptを利用することです。Let’s Encryptは米国の非営利団体であるISRGにより運営されています。無料で利用できる証明書ですので、個人でWebページを運営している人は利用するしかないですね。

certbotのインストール

まずはcertbotのインストールです。コマンド一つでできるので簡単です。前提で、CentOSでyumコマンドを利用します。

sudo yum -y install certbot
完了しました!

certbotで証明書作成

certbotコマンドが打てるようになりましたら、以下のコマンドにて証明書の作成ができます。対話型でも入力していくことができますが、1行入力するのみでも証明書が作成できます。certbotでは80番ポートを利用するので、80番ポートを利用しているWebサーバがあれば事前に停止しておく必要があります。

sudo systemctl stop nginx.service
sudo certbot certonly --standalone -d example.work -m admin@example.work --agree-tos -n
sudo systemctl start nginx.service

因みに80番ポートを利用中の場合は、こちらのエラーが発生します。

Problem binding to port 80: Could not bind to IPv4 or IPv6.

証明書は「/etc/letsencrypt/live/example.work/」に4つのファイルができます。その中でも、以下の2つを利用します。
・fullchain.pem:証明書
・privkey.pem :証明書の秘密鍵

nginxの設定変更

certbotコマンドで作成できた証明書をnginxに設定します。設定ファイル(/etc/nginx/conf.d/default.conf等)にSSLの設定を追記します。設定追加はhttpをhttpsにリダイレクトする設定と、今回作成した証明書でhttpsでアクセスできるようにする設定です。

以下、追記設定です。

server {
    listen 80;
    server_name example.work;
    return 301 https://$host$request_uri;
}
server {
    listen       443 ssl;
    ssl_certificate         /etc/letsencrypt/live/example.work/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/example.work/privkey.pem;
}

証明書の自動更新設定

コマンドラインで証明書を取得できれば、あとはcron設定するだけで自動で証明書を更新し、常時SSL化に対応できます。環境によりますが、こちらではcronでrootユーザとしてコマンドを実行するよう設定します。SSL化の更新は有効期限が残り30日以内に実施可能となるため、月2回確認するようにしています。

$ sudo crontab -u root -e
0 1 1 * * systemctl stop nginx.service
1 1 1 * * certbot renew
3 1 1 * * systemctl start nginx.service
0 1 20 * * systemctl stop nginx.service
1 1 20 * * certbot renew
3 1 20 * * systemctl start nginx.service

終わりに

無料でWebサイトを常時SSL化する方法についてご紹介しました。簡単ですので、Webページをお持ちの方はお試ししてみると良いと思います。