Webサービスやアプリを開発して運営するのが趣味です。



無料SSL証明書 Let's Encrypt の発行と自動更新をWebサーバー無停止で行う

2015年12月29日 22:33

★以下はパブリックベータ時点の方法です。仕様が変わってる可能性があります。★

最終動作確認: 2016年3月6日


Let's Encrypt とは

Let's Encrypt - Free SSL/TLS Certificates https://letsencrypt.org/

すべてのWebサイトの暗号化を目指す事を目標に、無料でSSL/TLS証明書を発行している、アメリカの非営利団体が運営しているサービスです。無料ということで疑ってかかる気持ちにもなりますが、Let's Encrypt のスポンサー には Mozilla、Akamai、Google などが名を連ねています。というように金のあるガチなプロジェクトなので信頼性は高いと言えます。ただし、2016年3月現在パブリックベータ版です。全てのWebサイトを暗号化するのはとても好ましいことですので、個人的にとても応援しています。

不便かと思ってしまう点(不便ではない)

Let's Encrypt で HTTPS をとりあえず使ってみる場合は Github - letsencrypt/letsencrypt の README にしたがってコマンドを打つだけできます。この通りに証明書を取ると気づくと思うのですが、イケてないんじゃないかと思ってしまう点が2つあります。

  • 80番ポートを開けないといけない。Webサーバーを停止しろと言われる。
  • 3ヶ月で証明書の期限が切れる

80番ポートを開けないといけないのは、取得する証明書のドメインを検証するために、認証サーバーから通信をするためでしょう。とりあえず使ってみたかっただけなので Nginx を停止させましたが、3ヶ月ごとにWebサーバー停止させるのは厳しすぎるのではと最初思ってしまいました。

しかしさすがにそんなことはなく、webroot プラグインを使えばWebサーバーを停止せずに証明書の作成と更新を自動化できたので、手順をメモしておきます。
参考記事 → Howto: easy cert generation and renewal with nginx - Server - Let's Encrypt Community Support

webroot プラグインとは

http://使用するドメイン/.well-known 以下に認証用のファイルを設置することで認証を行うプラグインです。/.well-known をWebアプリではなく、ただのコンテンツサーバーにすることで自動で認証してくれます。

Nginx での証明書発行例

下は Nginx の設定例です。権限があればどこでもいいんですが、一瞬ファイル作ってすぐ消すという動きをするようなので、/tmp/ に /.well-known 用のディレクトリを設置すると良いと思います。

server {
  listen 80;
  listen [::]:80;
  server_name example.com;

  location /.well-known {
    default_type "text/plain";
    root /tmp/letsencrypt-auto;
  }

  location / {
    return  301 https://$server_name$request_uri;
  }
}

Nginx の設定を読み込ませたら、以下のコマンドかスクリプトを実行。

# 予めletsencryptをダウンロードしておく。
git clone https://github.com/letsencrypt/letsencrypt
cd /path/to/letsencrypt
export DOMAINS="-d example.com"
export DIR=/tmp/letsencrypt-auto
mkdir -p $DIR

./letsencrypt-auto certonly --server https://acme-v01.api.letsencrypt.org/directory -a webroot --webroot-path=$DIR $DOMAINS

letsencrypt-auto に --webroot を渡してプラグインを使用。これで /etc/letsencrypt/live/example.net/ に証明書が作成されます。

letsencrypt

追記: 2015年に試した時はなかったんだけど、メールアドレス聞かれるようになってた。重要なお知らせがあった時に送る程度のものだそうです。

Nginx SSL の設定

/etc/letsencrypt/live/{ドメイン名} に証明書が生成されているので、後は通常通り Nginx の SSL を設定します。参考例は以下。NginxでSSLの評価をA+にする手順の通りにやれば更にセキュアになります。ssl_protocols で TLS のみにするだけでかなりマシ。

server {
  listen 443 default ssl;
  server_name example.com;

  ssl on;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

自動更新

証明書の更新は、作成に使ったコマンドに```--renew``` オプションを追加するだけです。

/path/to/letsencrypt renewコマンドだけで更新できるようになりました。/etc/letsencrypt/renewal に保存されている、certonly で作成した時の webroot ディレクトリなどの情報を利用して自動でやってくれるようです。


nginx実践入門 (WEB+DB PRESS plus)
久保 達彦 道井 俊介
技術評論社
売り上げランキング: 335