これまでStartSSLを利用してきたが、ちょっといろいろあるみたいで怪しいので、正式サービスが開始されたLet's Encryptに乗り換えてみた。正式な組織でもないし、とりあえず(技術的に)問題ない証明書で通信が暗合できればよいので、このサービスで必要十分である。実際に使ってみると、拍子抜けするくらい簡単だった。。
本サイトはGentoo Linuxで動いているので、Portageでクライアント「certbot」をインストールする。安定版としてマークされていないので、maskを解除してやる必要はあるが、普通にインストールできる。Pythonで作成されているらしい。
> emerge -av app-crypt/certbot
クライアントの名称がサービス開始前後で変更されたりしたため、Web上の情報はちょっといろいろ混乱があるようである。また、他のクライアントもあるらしいが、一応公式に提供されているもので、パッケージもあるので、これを使うことにした。昨日は必要十分である。
詳細には調べていないので、大まかな仕組みの理解のみ。
このサービスの目的は、組織自体を証明することではなく、手軽に通信を暗号化する点にあるように思う。証明書の発行のためには、少なくとも申請されたドメインについて、申請者が管理権限を証明できればよい。そのためにLet's Encryptは、証明書発行の申請があると、ドメインの管理権限がないと行うことができない作業を課して、それを確認することで証明書を発行する。そのプロセスは自動化されているため、証明書は瞬時に発行される。
簡単に調べた限り、利用可能な認証方法は2つある。
今回は、Webサーバの設定を変更したりするのが面倒だったので、DNSを用いた方法でやってみた。
非常に簡単だった。以下に示すコマンドを実行し、次の手順を進める。
> 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。
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を配置する方法。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ファイルに書かれている。