Let’s Encrypt
Let’s Encrypt については,昨年12月19日の投稿で既に多くの内容を書いた。ここでは,そことの重複もあるが,次回のインストールのためのメモとしてまとめて置くことにする。
今回のサーバー更新での目的の一つとして,webのhttps化があった。前回もhttps通信はサーポートしたが,それは自己証明書によるもので,私個人が証明書をPCにインストールして使用していた。今回は公式な証明書を利用して,基本的にすべての通信をhttps化したいと思った。
Let’s Encryptはドメイン認証書をACMEプロトコルを利用してネットワークから無料で証明書を発行してくれる。そのためのソフトウエアがACMEクライアントである。このACMEクライアントは色々あるが,https://letsencrypt.org/ja/docs/client-options/によれば,Certbotがお勧めとある。前回,CentOS8ではcertbot-auto を利用したが,Oracle Linux では動かなかった。そこで今回はcertbotを利用した。使い方は殆ど同じである。実際のコマンドは
/usr/bin/certbot certonly –webroot -w /web用ドキュメントフォルダ -d メイン名 –email メール –server https://acme-v02.api.letsencrypt.org/directory
等すればよい。
ACMEクライアントはACMEプロトコルに従ってletsencrypt.orgとの交信を行い,チェックにパスすれば,letsencrypt.orgが証明書を発行してくれる。ACMEプロトコルはRFC 8555によって規定されているが,この説明はletsencrypt.orgや他のwebにもある。ACMEプロトコルを実行するには,証明書を申請するドメインにhttpでアクセスできることが必要である。即ち,httpdが起動しており,申請ドメインのDocumentRootに実際にアクセスできることが必要である。ACMEクライアントは,letsencrypt.orgから送信されるデータをもとに,認証用データ作成し,それをDocumentRoot下に
/.well-known/acme-challenge/K6x ・・・ -dvHs
のような一時データを置く。それをletsencrypt.orgがアクセスし,申請ドメインの正確性をチェックする。このチャレンジにパスすると,証明書が発行される。私の場合(certbot ),発行された証明書は
- cert1.pem サーバー証明書
- chain1.pem 中間証明書
- fullchain1.pem 上記1,2ファイルを含む証明書
- privkey1.pem 認証用秘密鍵
であった。ここで,これらpemファイルの役割については,cetbot のホームページ
https://certbot.eff.org/docs/using.html#where-are-my-certificates
に詳しい説明がある。サーバー証明書については,Apache >= 2.4.8の場合は,fullchain.pem を使い,Apache < 2.4.8 の場合は,cert.pem とchain.pemを使うとある。また,pemファイルの内容は,openssl asn1parseコマンドを使って知ることができる。例えば,
openssl asn1parse -i -in fullchain1.pem
によって,fullchain1.pemの内容が表示される。
これらのpemファイルを利用すると,httpsが実現できる。即ち,これらの作業が完了後,対応するドメインのconfにhttpsの利用を記述して,httpdを再起動すれば,httpsでアクセス可能となる。例えば,現在のpearlblue.netの場合,Apache/2.4.37 (Oracle Linux)なので,/etc/httpd/conf.d下のpearlbule.net.confの<VirtualHost *443>以下に
SSLCertificateFile /etc/letsencrypt/live/pearlblue.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pearlblue.net/privkey.pem
等を記述すればよい。以上の手続きをまとめると,
- httpd を立ち上げる。
- 目的ドメインに対して,<VirtualHost *80>を,記述し,httpでアクセス可能とする。
- certbot コマンドを実行して,証明書を取得する。
- 目的ドメインに対して,<VirtualHost *443>を,記述し,httpsでアクセス可能とする。
- 必要なら,.htaccess を使って,httpからhttpsへのリダイレクト設定を行う。
となる。複数のバーチャルドメインも同様にして追加可能である。
Let’s Encrypt の証明書の有効期限は3ヶ月と短いので更新が必要であるが,
certbot renew
で全てのバーチャルドメインの証明書を(期限が30日未満の場合)更新してくれる。適宜手動でこのコマンドを実行すればよいが,cronを使って自動化する方法もある。