Let's Encryptのルート証明書切替周り(完結編)
tl;dr
- 驚くべきハックにより旧Androidも引き続き証明書エラーなくサイトを閲覧できそうです
- いよいよ5/4に標準の証明書チェーンが切り替わります
前回までのおさらい
Let's Encryptはルート証明書を自身(ISRG)の認証局のルート証明書(ISRG Root X1)に切り替えようとしています。現在は、IdenTrustのルート証明書(DST Root CA X3)が使われています。
正確に言うと、ISRGは新しい認証局なのでそのルート証明書の普及率も当然低く、中間証明書はIdenTrustのルート証明書でクロスサインされており、それが標準で使われています。標準がDSTになっているだけで、ISRGのルート証明書のチェーンの証明書も指定すれば今でも利用することができます。
それを、ISRG Root X1ルート証明書でサインされた中間証明書を標準に切り替えようとしています。経緯は以下に書いてあります。
https://letsencrypt.org/2019/04/15/transitioning-to-isrg-root.html
これはそもそも、ISRG自身のルート証明書に切り替えていくのが本命だというのと、IdenTrustのルート証明書の有効期限が2021年9月29日に迫っているというのが背景にあります。
しかし、ISRGのルート証明書がそれなりに普及してきたと思いきや、まだそれなりに利用されているAndroid7.1以前のトラストストアにはこのルート証明書が入っていません。つまり、以下の困った状況が発生しているわけです。
- ルート証明書を切り替えると、Android7.1以前の端末ではその証明書チェーンが使われているサイトが見られなくなる
- しかし、切り替えないままでいると、現状のDSTのルート証明書は今年の9/29に失効してしまうので、それまでにはなんとかしないといけない
これまでLet's Encryptは何度かデフォルトルート証明書の変更を計画してきましたが、延期をしてきました。しかし、遂に色々動こうとしています。
驚くべき解決方法
Let's Encryptを使う限りにおいては、今年の9/29日以降はAndroid7.1以前を切り捨てざるを得ないと考えられていましたが、なんと驚くべきソリューションが編み出されます。以下のエントリーにて昨年の12月21日にアナウンスされています。
https://letsencrypt.org/2020/12/21/extending-android-compatibility.html
これは、証明書チェーンのつなぎ方を工夫することで、古いAndroidでも引き続きサイト閲覧ができるようにするものです。https://letsencrypt.org/certificates/ の図が詳しいです。(日本語訳は古いので注意)
- 現行: R3 --> DST Root CA X3
- 新規: R3 --> ISRG Root X1 --> DST Root CA X3
ルート証明書をDST Root CA X3からISRG Root X1に切り替えるだけではなく、ISRG Root X1をさらに、DST Root CA X3でチェーンを繋ぐということをしている。ルート証明書にさらにルート証明書をつなぐというウルトラ技。そんなことしていいのか。
何故これが問題の解決になるのか
チェーンが R3 --> ISRG Root X1 --> DST Root CA X3 になると、通常の環境では、ISRG Root X1までチェーンをたどると、それがトラストストアに入っているので、そこで証明書検証が成功するわけです。ここまでは普通の話。
そして、7.1以前のAndroidの場合は、ISRG Root X1がトラストストアに入っていないため、さらにチェーンをたどってDST Root CA X3にまでたどり着きます。そして、DST Root CA X3は旧Androidのトラストストアに入っている為証明書検証が成功するわけです。
しかし、それでもDST Root CA X3は9月29日で失効するわけだから、結局それ以降はエラーになってしまうのではないかと考えるでしょう。その考えは正しいです、しかしなんとそうではないのです。
なんと、旧Androidはトラストストアに入っている証明書の有効期限検証をおこなわないため、2021年9月29日より後も証明書検証に成功するらしいのです。何ということでしょう…。
このハックにより古いAndroidも救えるようになりました。かなりDirtyなハックでもあるのでどうかと思う人もいるかも知れません…。
これで、ほとんどの環境で、何も問題は起こらないし、何もする必要はないはずだ、とアナウンスされています。
いよいよデフォルトチェーンの切替
上の12月のエントリでは、1月末から2月にデフォルトチェーンを切り替えると書かれていましたが、それが例によって延びまして、正式なアナウンスが4月1日に出ています。
https://community.letsencrypt.org/t/providing-a-longer-certificate-chain-by-default/148738
5月4日にデフォルトチェーンを切り替えるというアナウンスです。これはさすがに延期されないんじゃないでしょうか。
このアナウンスでは、この新規のチェーンをlong chainと呼んでいます。このlong chainのハックを嫌って、古いAndroidを切り捨てても良い、ということであればISRG Root X1がルートになる"short chain"を利用することも可能なようです。この場合はお使いのACMEクライアントのpreferred chainオプションに"ISRG Root X1"を指定する形になります。
ちなみに、DST Root CA X3がルートになるshort chainを発行する方法はどうも無くなってしまいそうなので、チェーン変更による影響が心配な場合は、念の為切替前に一度証明書を更新しておいても良いかも知れません。
まとめ
何事も起こらないと良いですね。
ところで、会社の方でもEngineering Blogを始めたので、そちらもご覧いただけると嬉しいです。
https://engineering.nature.global/
エンジニアも積極採用中ですので、興味ある方は是非ご連絡ください。