certbotを使ってLet’sEncryptの証明書を利用する時はwebrootオプションを使うのが無難
Let’sEncryptの無料証明書を利用しよう!
昨今はサイトのSSL化が必須です。
Let’sEncryptはもはや説明不要なほど有名な無料のSSL証明書です。
有料なものもありますが、機能的には変わらないため無料のLet’sEncrypt証明書で全く問題ありません。
Let’sEncrypt証明書を取得するには「Certbot」という公式のツールを利用します。
・公式サイト:https://certbot.eff.org/
・公式ドキュメントhttps://eff-certbot.readthedocs.io/en/stable/intro.html
インストール方法
インストール方法は複数あります。
公式はsnap推しですが、snap未導入であれば他の方法で問題ないです(snap意外と大きい)。
- snap 公式の推し。最新のものが使える
- ディストリビューションのパッケージ(apt, yum) →手軽で管理し易いがアップデートが遅い
- pip pipで入れる。pythonはだいたい入ってるのであり。
- docker 証明書取得のみ。
update, install certbotとかで慣れてればノールックでインストールできると思います。
詳しいインストール方法は上記サイトを確認してください。
certbotコマンドの使い方とオプションについて
certbotの機能について
certbotの機能は主に2つです。
- 証明書の取得(更新)
- 証明書のインストール(証明書の設定をしてhttps化してくれる)
私はcertbotによる設定書き換えは嫌なので、取得のみcertbotにやってもらいます。
インストールや更新はサーバ側で設定します。
certbotは対話型のコマンド
certbotは慣れてない人でも使えるように、対話型になっています。
プロンプトでcertbotとだけ打つと勝手に候補ドメインを教えてくれます。
# certbot
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: test.example.com
2: hogehoge.example.com
3: certbot.example.com
まだ作成していないサイトの証明書が取得には-d korekara.example.comなどとドメインを指定します。
対話型は慣れると面倒なので予め値を渡ししまう
対話は使わず、値は予め渡します。
認証はhttp認証を使います。(他にdns認証)
スタンドアロン( –standalone)はwebサーバが未導入の場合に使います。認証用の一時サーバが80,443ポート仕様するため一時的に稼働中のWEBサーバを停止しなければならないからです。
証明書は取得のみにします。
# certbot certonly --webroot -w /var/www/html -m lets@example.com -d example.com --agree-tos --dry-run
・certonly 証明書取得のみ
・--webroot -w ウェブルートを使います。-w移行に対象ドメインのドキュメントルートを指定
・-d 取得したいドメインを指定
・-m 連絡用メールアドレス(期限お知らせなどが届く。打たないと対話で聞かれる)
・--agree-tos 打たないと利用規約同意するか対話で聞かれる
・--dry-run テストするときはこれを打つ
–apacheや–nginxを使うとその稼働しているWebサーバで証明書の取得とインストールをしてくれますが、設定ファイルへの変更が入るため、予め設定ファイルのバックアップが推奨されています。
証明書のインストールは設定ファイル内で証明書ファイルの指定・SSL用設定の追記とWebサーバのリロード作業です。設定できるならこちらでやったほうが問題があったときに対処もしやすそうです。
実行すると/etc/letsencrypt/live/の配下にドメインのディレクトリがあり、証明書が発行されていると思います。
# ls /etc/letsencrypt/live/example.com/
cert.pem chain.pem fullchain.pem privkey.pem README
証明書のインストール
これは使っているWEBサーバなどのアプリケーションによって異なります。
下記の例はnginxを使っている場合に入れる設定です
server {
listen 443 ssl;
ssl on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
あとはwebサーバをリロードします。
自動更新
自動更新は更新のコマンド”certbot renew”を定期実行するツール(cronやsystemd)を使って一定の間隔で実行するのが一般的だと思います。ここでは管理しやすいcronで設定します。
# crontab -e
13 23 3,27 * * certbot renew --deploy-hook "/usr/sbin/nginx -t && /usr/bin/systemctl reload nginx" > /var/log/lets/letsencrypt.log
毎月3日と27日の23:13に更新をかけて、更新が成功したときのみ(–deploy-hook)nginxのconfチェックを行い、syntax okの時のみリロードする設定にしています。
/etc/letsencrypt/renewal-hooks/以下のdeployにスクリプトを設置すれば成功時に実行されます。(実行したくない場合は–no-directory-hooksで指定可能)
certbotのrenewal-hookについて(公式):https://eff-certbot.readthedocs.io/en/stable/using.html?highlight=renewal-hook#renewing-certificates