Let's Encrypt による証明書の発行
これまでStartSSLを利用してきたが、ちょっといろいろあるみたいで怪しいので、正式サービスが開始されたLet's Encryptに乗り換えてみた。正式な組織でもないし、とりあえず(技術的に)問題ない証明書で通信が暗合できればよいので、このサービスで必要十分である。実際に使ってみると、拍子抜けするくらい簡単だった。。
クライアントのインストール
本サイトはGentoo Linuxで動いているので、Portageでクライアント「certbot」をインストールする。安定版としてマークされていないので、maskを解除してやる必要はあるが、普通にインストールできる。Pythonで作成されているらしい。
> emerge -av app-crypt/certbot
クライアントの名称がサービス開始前後で変更されたりしたため、Web上の情報はちょっといろいろ混乱があるようである。また、他のクライアントもあるらしいが、一応公式に提供されているもので、パッケージもあるので、これを使うことにした。昨日は必要十分である。
Let's Encrypt の仕組み
詳細には調べていないので、大まかな仕組みの理解のみ。
このサービスの目的は、組織自体を証明することではなく、手軽に通信を暗号化する点にあるように思う。証明書の発行のためには、少なくとも申請されたドメインについて、申請者が管理権限を証明できればよい。そのためにLet's Encryptは、証明書発行の申請があると、ドメインの管理権限がないと行うことができない作業を課して、それを確認することで証明書を発行する。そのプロセスは自動化されているため、証明書は瞬時に発行される。
簡単に調べた限り、利用可能な認証方法は2つある。
- Webサーバの所定の場所に所定のファイル等を配置する
- 特定のURLに所定のファイルを配置できることをもってドメインの管理権限を確認する
- 既存のWebサーバ上に配置する方法と、certbotが一時的にWebサーバを起動する方法が選べる
- apacheやnginxのプラグインを利用すれば自動的に作業を行ってくれるようだ
- DNSのTXTレコードにチャレンジを登録する
- ACME DNS Challengeに対応
- 証明書発行の申請を行うとChallengeが発行されるので、それをDNSに登録する
- 手作業で登録になるが、BINDなどを管理しているならば手軽
今回は、Webサーバの設定を変更したりするのが面倒だったので、DNSを用いた方法でやってみた。
作業手順
非常に簡単だった。以下に示すコマンドを実行し、次の手順を進める。
- メールアドレスを入力
- 申請元のIPアドレスが記録され公開される云々を尋ねられるので、同意する。利用するサーバから申請していれば、特に問題もないと思う。
- ドメインを引数で渡していなければ、証明書を発行するドメインを尋ねられるはずなので、入力する。-d で指定していれば聞かれない。SANに対応しているので、ドメインを複数指定すると一枚の証明書で複数のドメインに使える。
- DNSのTXTに登録するためのchallengeが発行される。ここでEnterキーを押してはならない。Enterを押すと、次のステップでDNSの確認が来るが、まだ登録できていないので失敗する。
- 別の端末などを開いて、提示されたchallengeをDNSに登録する。
- 先の手順でEnterを押すと認証が行われ、成功すると /etc/letsencrypt以下に証明書や秘密鍵が保存される
- /etc/letsencrypt以下には諸々の管理ファイルもおかれるが、基本的にはliveサブディレクトリの証明書を利用すればよい。再発行や更新等を行っても、常にliveディレクトリ内は最新の証明書になる。古いバージョンの証明書も保存されており、liveディレクトリ内には最新の証明書のシンボリックリンクが作られる。
- 証明書の更新や再発行は、発行時と同じコマンドを使えばよい。既に証明書がある場合、新規発行とは異なるメニューが表示されるので、必要な操作を選択すればよい。
- 全部リセットしてやり直したいときは、とりあえず/etc/letsencryptディレクトリ内を削除
> certbot certonly --manual --preferred-challenges dns --rsa-key-size 4096 -d rcps.jp -d www.rcps.jp -d master.rcps.jp
gentooの場合のコマンド名は「certbot」。Web上の情報では、「certbot-auto」や旧コマンド名などもあり、混乱するがGentooではシンプルにcertbot。
- certonly
- 証明書の発行のみを行うサブコマンド。Webサーバに自動で証明書の設定まで行うことができるコマンドもあるが、Webサーバだけではなくメール関係にも設定するので、とにかく証明書だけ手に入れる。
- –manual
- マニュアルプラグイン。ドメイン認証を手動で行う。こちらも、DNSやWebサーバにchallengeを自動的に配置することもできるが、手動で行う。自動化の設定をしている間に、DNSのTXTレコードを書けてしまう。。。
- –preferred-challenges dns
- DNSでの認証を行う。ヘルプに書かれていないので不親切。きちんとヘルプに書いておいてくれ。。
- –rsa-key-size 4096
- 鍵の長さ。デフォルトでは2048bit。ほぼ自分で使うだけなので負荷は気にしない。気分的に対応している最大長に設定。
- -d ドメイン名
- 認証するドメインを「-d」で列挙。複数のドメインを指定した場合は、1つ1つについてchallengeが発行されるので、そのドメインに応じたDNSに登録する。ワイルドカード証明書は作成できないので、利用するホスト名、サブドメインはすべて列挙しておく。証明書が複数でも構わなければ、列挙せずに別の証明書を発行すればよいが、1枚で対応できると楽。
DNSに登録するレコード
bindの場合、以下のレコードを登録する。
_acme-challenge.rcps.jp. IN TXT "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" _acme-challenge.www.rcps.jp. IN TXT "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" _acme-challenge.master.rcps.jp. IN TXT "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
“xxxxxxx”に提示されたchallengeを入力する。
_acme-challenge以下は、認証するドメインとなる。複数のサブドメインやホストを登録する場合は、サブドメイン以下についてもレコードを作成する。例では、ドメイン1つと2つのホスト名に対して証明書発行の申請をしているので、DNSにも3つのレコードを登録する。
Webサーバにchallengeを配置する方法
Webサーバ上の特定のディレクトリにchallengeを配置する方法。DNSのゾーンファイルを書き換えたりする必要がないため、手軽。証明書の取得だけでも可能。apacheで自動的に証明書を配置したりする場合にはcertbot-apacheパッケージなども必要であるが、Webサーバにchallengeを配置して認証するだけであれば、プラグインは必要ないようである。
上記コマンドを以下のように変更すれば、自動的に認証が行われる。認証終了後は一時ファイルなど何も残らないようだ(指定したディレクトリは空)。
> certbot certonly --email root@rcps.jp --rsa-key-size 4096 --redirect --webroot -w /var/www/localhost/htdocs -d rcps.jp -d www.rcps.jp -d master.rcps.jp
認証方式を「–webroot」とし、「-w」オプションでWebサーバのドキュメントルートディレクトリを指定する。
証明書の設定
証明書が発行されたら、apacheやpostfix、Dovecot等の設定ファイルに証明書のパスを設定してやる。
/etc/letsenrypt/live以下に、証明書ごとにドメイン名でサブディレクトリが作られ、証明書や秘密鍵が保存される。SANによる複数ドメインの証明書を作成したときは、最初に指定したドメインのがサブディレクトリ名になるようである。ディレクトリ内のファイルの内容はREADMEファイルに書かれている。
- privkey.pem
- 秘密鍵
- fullchain.pem
- 認証局の情報も含む証明書。通常はこれを証明書として使えばよい。
- cert.pem
- チェーン情報がない単独の証明書。使用は推奨されないと書かれている。このファイルを利用する場合は、以下のchain.pemを別途サーバに設定しなければならないはず。fullchain.pemは、cert.pemとchain.pemを1つのファイルに結合しただけだが、最近はこれでまとめて処理してくれるようだ。
- chain.pem
- 認証局の証明書。