Let’s Encryptで証明書失効

ウェブ証明書の更新にもすっかりなれたLet’s Encrypt
前回同様有効期限の切れる10日前に通知メールが届きました。
しかし今回は更新する前に以前の予告どおり、
現証明書を失効させてみます。

電子証明書はその正当性を担保するために、
一般に対しては秘密にしておかなければならない秘密鍵を利用していますが、
万一これが外部に漏れると、他者によるなりすましが可能となり、
何らかの被害が発生するおそれがあります。
もし漏洩したらそれを失効することで、
たとえなりすましていても、第三者がそれを不正と見抜けるようにできます。
ただし副作用として本家でさえも不正なように見えるので、
本家では新しい証明書に入れ替えて正当性を証明します。

Let’s Encryptでも証明書の失効をサポートしており、

# cd /usr/local/src/letsencrypt/letsencrypt
# ./letsencrypt-auto --help revoke

を実行するとやり方が出てきます。で、

# /etc/init.d/apache2 stop
# cd /usr/local/src/letsencrypt/letsencrypt
# ./letsencrypt-auto revoke --cert-path /etc/letsencrypt/live/<FQDN>/fullchain.pem
# /etc/init.d/apache2 start

を実行してみたところちゃんと失効できるようです。
最初実行結果について特に表示がなかったため、
何か間違ったのかと思い、とりあえずもう一度実行したところ、
すでに失効されている旨がエラーとして表示されましたので。

実際直後にFireFoxからその失効した証明書を持つサイトにアクセスすると、

安全な接続ができませんでした

<FQDN> への接続中にエラーが発生しました。 Peer's Certificate has been revoked. (エラーコード: sec_error_revoked_certificate)

    受信したデータの真正性を検証できなかったため、このページは表示できませんでした。
    この問題を Web サイトの管理者に連絡してください。

のようなページが表示されて本来のコンテンツが表示されません。
実はこれ、FireFoxの[設定]で
[OCSPレスポンダに問い合わせてデジタル証明書の有効性をリアルタイムに確認する]
が有効になっているからです。
失効情報についてはCRLという静的リストの形で配布され、
それを各アプリケーションがダウンロードして参照して判断することが長く行われ、
現在でも行われていますが、
それだと最新情報に更新するための遅延が発生してしまうので、
最近はOCSPを利用して失効情報をリアルタイムに取得します。
ちなみになぜFireFoxでテストしているのかというと、
Chromeは失効情報を確認してくれないからです。

ところでFireFoxの先の項目を無効にすると、
証明書の失効前のように何事もなく本来のページが表示されます。
こうなるとCRLを使うことになるのですが、その方法がよく分からない…
1週間経っても失効情報を無視して普通に表示されます。
Chrome以外のメジャーなブラウザはOCSPをサポートしているので、
もはやCRLをサポートしていないのかもしれません。
しかし組織内勝手証明書などの存在を考えると、
CRLの完全廃止というのはちょっと乱暴な気もします。

さて、証明書の詳細を見ると
[CRL Distribution Points]([CRL 配布ポイント])項目があり、
ここにCRLを入手するためのURLが記述されています。
で、取得したCRLファイルについて

$ openssl crl -inform DER -in <CRLファイル>  -text

を実行すると、
失効証明書のシリアル番号と失効日時のリストが見られます。
ということでLet’s Encrypt発行の証明書を見るも
[CRL Distribution Points]項目が…ない。
Startssl.com発行の証明書に関してはちゃんとあって
失効情報を確認できるのに。
ひょっとしてLet’s EncryptはOCSPのみサポートということかもしれません。
それでも実用上問題はないでしょうし。
証明書の有効期限を短くしているのはそのあたり鑑みてのことなのかも。
ちなみにStartssl.comでの失効は有料なので試すつもりはありません。

なお証明書には[Authority Information Access]
([認証局アクセス情報])という項目があり、
ここにOCSPレスポンダ(OCSPの問い合わせ先)のURIが記述されています。
Let’s Encryptの証明書にはこれは含まれています。

最後に

# /etc/init.d/apache2 stop
# cd /usr/local/src/letsencrypt/letsencrypt
# ./letsencrypt-auto renew
# /etc/init.d/apache2 start

で証明書の更新をして正常に戻しておきます。
これでOCSPが有効なウェブブラウザからも正常にアクセスできます。

話は変わりますが、”letsencrypt-auto”コマンドを実行したときに、

You are running with an old copy of letsencrypt-auto that does not
receive updates, and is less reliable than more recent versions. We
recommend upgrading to the latest certbot-auto script, or using
native OS packages. 

とか表示されました。
ツールの名前が変わったから新しいのを使えとの案内ですが、
コマンド名から”letsencrypt”が消えたのは、
他の証明書発行サービスでも使える汎用ツールへと
歩み出した証拠なんでしょうか。
そもそもそういう野望があるようなことは
何かのインタビューで読んだ覚えがあります。
ただこの更新の方法には一長一短あるので、
StartSSLのようなところが対応するにしても、
従来の手順も残してほしいところです。
ちなみにツールの更新は次回の証明書の更新時にでもしようかと。