目次

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サーバの設定を変更したりするのが面倒だったので、DNSを用いた方法でやってみた。

作業手順

非常に簡単だった。以下に示すコマンドを実行し、次の手順を進める。

  1. メールアドレスを入力
  2. 申請元のIPアドレスが記録され公開される云々を尋ねられるので、同意する。利用するサーバから申請していれば、特に問題もないと思う。
  3. ドメインを引数で渡していなければ、証明書を発行するドメインを尋ねられるはずなので、入力する。-d で指定していれば聞かれない。SANに対応しているので、ドメインを複数指定すると一枚の証明書で複数のドメインに使える。
  4. DNSのTXTに登録するためのchallengeが発行される。ここでEnterキーを押してはならない。Enterを押すと、次のステップでDNSの確認が来るが、まだ登録できていないので失敗する。
  5. 別の端末などを開いて、提示されたchallengeをDNSに登録する。
  6. 先の手順でEnterを押すと認証が行われ、成功すると /etc/letsencrypt以下に証明書や秘密鍵が保存される
  7. /etc/letsencrypt以下には諸々の管理ファイルもおかれるが、基本的にはliveサブディレクトリの証明書を利用すればよい。再発行や更新等を行っても、常にliveディレクトリ内は最新の証明書になる。古いバージョンの証明書も保存されており、liveディレクトリ内には最新の証明書のシンボリックリンクが作られる。
  8. 証明書の更新や再発行は、発行時と同じコマンドを使えばよい。既に証明書がある場合、新規発行とは異なるメニューが表示されるので、必要な操作を選択すればよい。
  9. 全部リセットしてやり直したいときは、とりあえず/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。

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ファイルに書かれている。