Let’s Encrypt

「Let’s Encrypt」と言っても「さあ暗号化しよう」という意味ではなく、「Let’s Encrypt」自体がプロダクト名です。その実態は2016年4月に運用を開始した「無料でWebサーバ向けのSSL/TLS証明書を発行している認証局」です。

https://letsencrypt.org/

通常の認証局と異なり、発行されるSSL証明書の有効期限が90日と短い訳ですが、無料かつ迅速にSSL証明書が発行されることから、レンタルサーバ業者でもこれに対応するところが増えてきています(例えばさくらのレンタルサーバは対応済みです)。

CentOS7環境であれば、yumで必要なプログラム群を導入し、それを実行することで手軽にSSL証明書を導入する事が出来ます。また、自動更新処理も組み込めるので、これまでその費用感から導入を躊躇していた環境でもSSL化が可能になるのではないかと思われます。

余談ですが、昨今ではweb(http)以外にもSSL化が進んでおり、例えばメール(SMTP/POP/IMAP)に関してもSSL(TLS)化が推奨されています。とは言え、設定を正しく行なわなければならず、2020年前半にgmailで発生した問題はSSL証明書に記載のホスト名とDNSで名前解決される(或いはメールサーバ側が名乗っている)ホスト名が相違している事に起因しておりました。

Let’s Encryptの導入

上記の通り、CentOS7環境であれば下記のコマンドを実行する事で導入出来ます。なお、事前にEPELレポジトリを読み込むようにしておく必要があるのでご注意ください。

# yum -y install certbot python-certbot-apache

正常にインストールが出来ましたら、下記のコマンドを実行します。なお、ここでは発行するサイトのFQDNと、httpd.conf等で設定するDocument Rootをそれぞれ入力する必要がありますので適宜読み替えてください。

certbot certonly --webroot -w /PATH/TO/YourWebSite/htdocs/ -d EXAMPLE.COM
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): YourMailAddress@EXAMPLE.COM
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

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, once your first certificate is successfully issued, 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: N
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for EXAMPLE.COM
Using the webroot path /PATH/TO/YourWebSite/htdocs for all unmatched domains.
Waiting for verification…
Cleaning up challenges
IMPORTANT NOTES:
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/EXAMPLE.COM/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/EXAMPLE.COM/privkey.pem
Your cert will expire on 2020-12-14. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew all of your certificates, run
"certbot 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

上記はあくまでも入力例です。それぞれの環境に対応する形で読み替えて実行して頂ければ結構です。細かい事柄については既に上記の実行例に記載されておりますのでそれを読んで頂ければよいのですが、ここまでの段階で既にSSL証明書の発行は終了しております。

上記の例では/etc/letsencrypt/live/EXAMPLE.COM配下に「証明書ファイル(cert.pem)」「中間証明書ファイル(chain.pem)」「証明書+証明書ファイル(fullchain.pem)」「秘密鍵ファイル(privkey.pem)」がそれぞれ生成されています。Apacheの場合はssl.confの任意の箇所のファイル名を書き換える事により生成したSSL証明書を読み込ませることが出来ます。記述例(抜粋)は下記の通りです。

SSLCertificateFile /etc/letsencrypt/live/EXAMPLE.COM/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/EXAMPLE.COM/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/EXAMPLE.COM/fullchain.pem

ちなみに「fullchain.pem」は主にPostfixやdovecot等のメールサーバ側でSSL対応をする際に使用します。証明書と中間証明書を一緒にしておかないとgmail等とやり取りする際にエラーになりますのでご注意ください。

証明書の更新

証明書の更新は下記のコマンドを実行するだけです。

certbot renew

ただしApacheの場合は証明書を更新した後再起動が必要です。crontab等で自動実行させると良いでしょう。ただし、再起動前にapachectl configtest等で設定ファイルが正常である事を確認する処理を組み込んでおいた方が良いかも知れません。

crontabの記述例はこんな感じです。この例では余裕を見て2ヶ月毎に更新するようにしています。

0 0 1 2,4,6,8,10,12 * /bin/certbot renew > /dev/null 2>&1

ところが、ワイルドカード証明書だとこれが出来ません(エラー吐いて強制終了します。詳細は調べていませんが、ワイルドカード証明書の場合は都度DNSレコードの認証が必要なので、それに対応しているプラグインを導入して環境構築しない限り、手動での更新が必要となります)。

certbot-auto

certbot以外に「certbot-auto」というものがあります。git経由で導入した場合にはスクリプト一覧に入っていますが、そうでない場合は別途導入が必要です。

# curl https://dl.eff.org/certbot-auto -o /bin/certbot-auto
# chmod 700 /bin/certbot-auto

入手したら「certbot-auto」を実行しますが、内部的にyumを起動して、必要なパッケージの導入と更新を実施しています。導入後は下記のようなコマンドを実行して証明書の更新手続きを実施します。

# /bin/certbot-auto -d 'WWW.EXAMPLE.COM' --force-renewal

「–force-renewal」を付与しないと「既にディレクトリが存在します」というエラーが出て途中で終了します。なお、こちらを実行するとhttpd.conf内の該当ドメインの箇所を書き換えて、下記の記述を追加します。

RewriteEngine on
RewriteCond %{SERVER_NAME} =WWW.EXAMPLE.COM
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

そして新しい証明書は「WWW.EXAMPLE.COM-0001」というように新しいディレクトリに配置されるので、ssl.confの任意の箇所のパスを書き換える必要があります。

ワイルドカード証明書の場合はcertbotを用いた下記のコマンドを実行して、更新手続きを実施します。

certbot certonly --manual --domain *.EXAMPLE.COM --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

「–server」以下のパスは初回で生成したconfファイル内に記述があるので、それをそのまま記述します。なお、実行するとチャレンジ用の文字列が表示されるので、それを該当ドメインのTXTレコード検索で出てくるようにDNSゾーンレコードを編集して更新します(この間、コマンドの実行を止めてはなりません。再実行すると文字列が変わってしまいます)。DNSサーバで当該文字列の検索・表示が出来るようになったらスクリプトを継続すると、認証処理が行なわれた後「新しい場所に」更新された証明書一式が置かれます。

初回:/etc/letsencrypt/live/EXAMPLE.COM/cert.pem
更新時:/etc/letsencrypt/live/EXAMPLE.COM-0001/cert.pem

シンボリックリンクを張るなり、上書きするなり、httpd.conf(ssl.conf)の方でパスを書き換えるなりしてからApacheを再起動すれば更新が反映されます。

Let’s Encryptは冒頭でも述べている通り無償で利用できます。とは言えDonationも可能ですので、金銭的に余裕があれば寄付するのが望ましいでしょう。

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

前の記事

install memo

次の記事

Doctrine for Symfony4