Let's Encrypt に重大なバグが発覚。該当サイトは2020/3/4 までに対応が必須

Let's Encrypt にバグが発見されました。~~利用ドメイン全体の 2.6% のサイトに影響があるとの事です~~ 有効な証明書の 2.6% に影響があるとの事です。影響があるサイトは **2020/3/4 までに対応が必要です。すでに期限は過ぎています**。該当サイトには個別にメールが届きますが、メールが届かない場合もあるとの事なので注意して下さい。

この記事では問題の概要と該当するかどうかの確認方法、および対応方法について記載しています。

## 記事の修正を行いました（2020/3/6 追記）

この記事は筆者の予想をはるかに超えて多くの方に読んで頂きました。ありがとうございます。改めて読み返してみると不完全な部分も多かったため、以下の修正を行いました。

 * 2.6% の意味が不正確だったので修正
 * バグの概要と、その影響について以下の項に追記
  * 問題の概要
  * どんな影響があるのか？
 * 確認方法の詳細、補足説明、注意事項を追加
 * 対応方法について独立させた
 * その他以下を追記
  * メールが来ていなければ問題ないのか？
  * 今問題なければ問題ないのか？
  * まとめ


この記事では最低限やらなくてはならない事に限定して紹介したいと思います。問題の詳細等については別の記事を作りましたので、よかったらそちらもご覧下さい。

 * [証明書300万件を強制失効。Let's Encrypt に一体何が起きたのか？](https://qiita.com/matsumoto_sp/items/93275ca2123d92615bd7)

## 問題の概要

無料で SSL/TLS 証明書を自動的に発行する Let's Encrypt は、Boulder というサーバーソフトウェアを利用して証明書を発行しています。このシステムにバグが見つかってしまい、これまで発行した証明書を失効しなくてはならなくなりました。失効させる証明書は約300万通との事であり、これは現在有効な証明書の約 2.6% に当たるとの事です。

## どんな影響があるのか？

サイトの証明書が失効されてしまうと、'https://～' で始まるページはほぼ利用不可能になると思って下さい。常時 SSL 化を採用しているサイトならトップページが閲覧不可能になります。失効された時のブラウザでの表示は証明書の有効期限切れの状態に近い物です。以下の図は Google Chrome で失効された証明書を利用しているサイトを表示している様子です。

![revoked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347126/3d3824ca-97b0-05a5-e0ab-6d2d4bc8bfb4.png)


## すぐに確認したい人のために

自分のサイトが今回の失効措置の対象となっているかどうかは、以下の URL で確認できます。

 *  https://checkhost.unboundtest.com/ 

以下のような入力フォームが表示されますので、サイトのドメイン名を入力し、`Query` をクリックします。

![check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347126/2cf3681a-4c53-9d77-488a-5dab0ce88a06.png)


結果表示ページは簡素な物ですが、1行で1サイトずつ表示されます。以下のように表示されれば影響がありません。

> The certificate currently available on <ドメイン名> is OK. It is not one of the certificates affected by the Let's Encrypt CAA rechecking problem. Its serial number is <シリアルナンバー>

上記とは異なる表示になった場合は影響を受ける可能性があります。

なお、**この方法で確認できるのは、証明書をウェブサイトで利用している場合だけ**です。メールサーバー等、ウェブサイトとは異なる目的で利用している証明書については、この後に説明する方法で確認して下さい。

## 影響を受けたらどうすればよいのか？

証明書を更新するだけです。更新方法は利用状況によって異なる可能性がありますが、一般的には以下のようにします。

```sh
certbot renew --force-renewal
```

## 今問題なければ問題ないのか？

Let's Encrypt は今回の措置を 3/4 に行いました。従って今現在サイトが問題なく表示されていれば問題ないかと言うと、そうではない可能性もあるので注意して下さい。別記事でも触れていますが、まだ措置が終わっていない可能性があったり、正常な時の失効情報がキャッシュされていて問題ないように見えているだけの可能性があります。

## メールが来ていなければ問題ないのか？

Let's Encrypt では影響を受けるユーザーにメールでその旨を連絡したとの事ですが、連絡が取れなかったユーザーが居るとも言っています。メール不達はレアケースだとは思いますが、Let's Encrypt を利用している場合は一度は確認する事をお勧めします。

## ウェブサイト以外で利用している証明書の確認方法

メールサーバー等、ウェブサーバー以外の目的で証明書を利用している場合、以下の方法で確認します。

まず今回の問題に該当する証明書のシリアルナンバー一覧を入手します。URL は以下の通りです。

 * https://d4twhgtvn0ff5.cloudfront.net/caa-rechecking-incident-affected-serials.txt.gz

このファイルは gz 圧縮されていますので、展開して下さい。Linux 系 OS の場合以下のようにします。

```
wget https://d4twhgtvn0ff5.cloudfront.net/caa-rechecking-incident-affected-serials.txt.gz
gunzip caa-rechecking-incident-affected-serials.txt.gz
```

次に調査したい証明書からシリアル番号を取得します。openssl のコマンドで取得する場合は以下のようにします。

```sh
openssl x509 -in <証明書ファイル名> -serial -noout | tr 'A-Z' 'a-z'
```

成功すると以下のような形でシリアル番号が表示されます（サンプルとして記載しているシリアル番号は google.co.jp の物です）。

```
serial=00eede6560cd35c0af02000000005971b7
````

この番号を先ほどダウンロードし、展開したファイルから探します。

```sh
grep -F <シリアル番号> caa-rechecking-incident-affected-serials.txt
```

openssl が出力するシリアル番号は大文字を利用していますが、`caa-rechecking-incident-affected-serials.txt` 内には小文字で記述されているので注意して下さい。上記のように `tr` コマンド等で変換すればオーケーです。

検索し、何かヒットすればバグの影響を受けます。すぐに証明書の更新をして下さい。

## 大量の証明書を管理している場合

多数のお客さんの証明書を管理している場合等は、ちまちまやってられません。バッチ処理しましょう。まず、全証明書のフルパスを取得するコマンドを作ります。管理状態によって異なると思いますが、certbot の基本的な運用に従っている場合、以下のコマンドでフルパス一覧が取得できると思います。

```sh
ls /etc/letsencrypt/live/*/cert.pem
```

証明書の一覧を取得したら、以下のコマンドで全証明書のシリアル番号を入手し、検索します。


```sh
grep -E $(
    for CERT in $(<全証明書の一覧取得コマンド>) 
    do 
       openssl x509 -in $CERT -serial -noout; 
    done |
    perl -pe 's/^serial=(.*)$/\1/' |
    tr 'A-Z' 'a-z' |
    tr '\n' '|' |
    perl -pe 's/\|$//'
)   caa-rechecking-incident-affected-serials.txt
```

この方法は証明書が 1000件程度ぐらいまでなら対応できます。それ以上だとコマンドラインが長くなりすぎてうまく行かないと思いますので別の方法を模索して下さい。

該当があったら証明書を更新しましょう。

## 関連情報

 * バグの詳細
  * https://community.letsencrypt.org/t/2020-02-29-caa-rechecking-bug/114591
 * 3/4 に問題のある証明書を失効させるお知らせと、Q & A
  * https://community.letsencrypt.org/t/revoking-certain-certificates-on-march-4/114864

## 最後に

うちでは 200ドメイン弱を管理しているのですが、数件の該当がありました。2.6% は決して低くない数字です。Let's Encrypt の証明書を利用している場合は、一度は確認してみる事をお勧めします。

## まとめ

 * Let's Encrypt は 2020/3/4 に、バグから派生する問題を解決するために発行済証明書の失効手続きを行った
 * 約300万件の証明書に影響が発生している(全体の2.6%)
 * ウェブサイトに証明書を利用している場合
  * https://checkhost.unboundtest.com/  にアクセスして問題ないか確認する
 * ウェブサイト以外に証明書を利用している場合
  * 失効リストを入手し、openssl 等のコマンドで確認する
 * 影響を受ける証明書のユーザーにはメールで通知が送られてくるはずだが、届いていない可能性もあるとの事
 * また、今現在サイトが正常だからと言ってそれだけでは安心できない。一度は確認した方が無難