lambda consulting

神様、仏様、Let's Encrypt様

June 01, 2016

Let's Encrypt

ほんのつい最近まで、サーバ証明書を取得するというのは、結構金額がかさむものだった。
数人の社員しか使わないような小ぢんまりとしたサーバでも、インターネット側に出したい場合には、暗号化しないわけにもいかず、「何か割に合わんな」と思いながらお金を払っていた。

ちなみにSSL化するのに必要となるサーバ証明書には、大きく次の3種類がある。

  1. DV : Domain Validated / ドメイン認証型 : 申請者がドメインの持ち主であることを確認
  2. OV : Organization Validated / 実在証明型 : 申請者の組織が実在することを確認
  3. EV : Extended Validated / 拡張実在証明型 : 申請者の組織を厳格(?)に確認 (この証明書だとブラウザのアドレス欄が緑になる)

下にいくほど、信頼性が高いとされていて、当然、価格もお高い。

こちらの目的は、通信を暗号化したいだけなので、当然、DVでいいのだが、それでもそれなりの値段するし、更新の度に費用が発生する。さらに、CSR作って送ったりと面倒なことも多くて、サーバ証明書と聞くだけで、イラっとすることが多かった。

そんなちょっとした暗黒の時代が続いていたが、2016年4月12日に、我らが救世主 Let’s Encrypt が正式サービスを開始した。

証明書の種類としては、DVだけであるが、なんとタダでいいというのである。こちとらDVで十分なので、喜ばしいかぎりなのだが、タダでいいとなると、今度は、ちょっと申し訳ない気持ちになってきてしまう。でも、ありがたく使わせていただこうということで、その手順を。

0. 前提

サーバ証明書をインストールしたいサーバにLet’s EncryptのクライアントソフトウェアであるCerbotをダウンロードし、実行する必要がある。
このCerbotがサーバ情報の送信、サーバ証明書の取得、および、サーバ証明書の更新(有効期間90日)を行ってくれる。(CLIベースで実行できるので、cronで自動化できる)

以下手順では、HOMEディレクトリにcerbotディレクトリが展開されることとする。

1. Cerbotのダウンロード

gitclone する。

$ cd
$ git clone https://github.com/certbot/certbot

2. テスト実行

cerbot が機能する環境であるかのチェックする。(内部でyum等のパッケージインストールが実行されるためroot権限のパスワードが要求される)

$ cd cerbot
$ ./cerbot-auto
[sudo] password for your-name:

内部でyum等でパッケージインストールが実行されると言ったが、pythonはじめ、結構な量のパッケージがインストールまたはアップデートされる。
パッケージのバージョンを厳格に管理する必要がある場合は、事前に Let’s Encrypt のサイトで確認したほうがいい。
尚、パッケージをインストールする前に、一応最終確認はしてくる。

尚、こちらで試した環境では、opensslパッケージのバージョンが古く、エラーで停止したのでアップデートがに ./cerbot-auto を再実行した。(環境: CentOS 6.5)

$ sudo yum clean all
$ sudo yum update openssl openssl-devel

パッケージのインストール/アップデートが完了すると、TUIの青い画面で、以下の様に聞いてくる。
ここまででくるとテストの目的は完了したので、<NO>を選択して終了する。

No names were found in your configuration files.
You should specify ServerNames in your config files in order to
allow for accurate installation of your certificate.
If you do use the default vhost, you may specify the name manually.
Would you like to continue?
                 < Yes >           < No  >

3. サーバ証明書の取得

CSRの作成等を手動で実行する必要はなく、全て、cerbotがやってくれる。このサーバで利用したいDNS名(以下ではmy-domain.jp)を準備した上で、再びcerbotを実行する。
[重要] 実行プロセスの中で、PORT80のチェックが行われるため、PORT80を使用しているWEBサーバなどがあれば、サービスを停止しておく(下の例では、Nginxが動いている前提で、まずそれを止める)。

$ sudo service nginx stop
$ ./certbot-auto certonly --standalone -d www.my-domain.jp

オプションの

実行すると、

サーバ証明書の取得が無事成功すると、IMPORTANT NOTES: - Congratulations! …. will expire on 2016-yy-mm … というメッセージが表示され、処理が完了する。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.my-domain.jp/fullchain.pem. Your
   cert will expire on 2016-yy-mm. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot-auto again.
   To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - 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

yy-mmは、実際には、90日後の日付。「有効期限は、3ヶ月だから、それまでに”cerbot-auto renew”で更新してくださいね!」的なメッセージが表示されている。

取得できたサーバ証明書は、次の場所に保存される。

$ su -
# cd /etc/letsencrypt/www.my-domain.jp
# ls -l
 cert1.pem
 chain1.pem
 fullchain1.pem
 privkey1.pem
  1. cert1.pem : サーバ証明書(公開鍵)
  2. chain1.pem : 中間証明書
  3. fullchain1.pem : サーバ証明書と中間証明書の結合ファイル
  4. privkey1.pem : 秘密鍵

但し、これらは、ファイルの実体で、1となっている数字の部分は、更新する際に変更される。
これらのファイルに対して、各々、次のシンボリックリンクも生成されているので、WEBサーバに設定する際は、こちらを使う。

  1. /etc/letsencrypt/live/www.my-domain/jp/cert.pem
  2. /etc/letsencrypt/live/www.my-domain/jp/chain.pem
  3. /etc/letsencrypt/live/www.my-domain/jp/fullchain.pem
  4. /etc/letsencrypt/live/www.my-domain/jp/privkey.pem

4. WEBサーバへの設定

WEBサーバによって、設定方法は異なるが、ここでは、Nginxでの設定例 (/etc/nginx/conf.d/my-domain.conf)

server {
  listen 443 ssl;
  server_name www.my-domain.jp;

  root /var/www/html;

  access_log /var/log/nginx/ssl_access.log;
  error_log /var/log/nginx/ssl_error.log;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/www.my-domain.jp/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/www.my-domain.jp/privkey.pem;
}

Nginxの場合、

WEBサービスを起動する。

$ sudo service nginx start

ブラウザでhttpsアクセスし、正しく証明書が設定されているかを確認する。

5. サーバ証明書の更新

しつこいようだが、Let’s Encryptのサーバ証明書の有効期間は、90日間
よって、80日目頃には、サーバ証明書の更新を行う。更新処理は、簡単で、certbot-auto renew を実行するだけ。
ただし、はじめの証明書の取得と同様にWEBサービスは一時的に停止する必要がある。
(WEBサービスを停止せずに証明書を更新する方法もあるが、詳しくは、Let’s Encrypt 参照)

$ sudo service nginx stop
$ cd cerbot
$ ./certbot-auto renew
$ sudo service nginx start