Let's Encryptのルート証明書が失効していた(古い端末じゃないのに)

October 1, 2021

古い端末しか影響を受けない理解だったのだけど、 なぜかとあるサイトが最新のChrome(やEdge、Safari)でも駄目だった。

※ なお、Firefoxは問題なし

証明書情報を見ると確かに「DST Root CA X3」がルートになっており、 期限切れ扱いになる。

そのサーバーには他のドメインも相乗りしていて、 それらは正しく「ISRG Root X1」が使われていた。

証明書を強制更新してみても駄目。全部削除して発行し直しても変わらず。

HTTPサーバー(Apache 2.2)設定の問題か?ということで他のドメインとの比較してみると違いがあった。

駄目な例

1
2
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

大丈夫な例

1
2
3
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

fullchain.pemがおかしいのかと中身を見てみたが、 ちゃんと「example.com → R3 → ISRG Root X1」になっていると思うのだが…ということで原因ははっきりせず。

ひとまず解消してよかった。(今日お休みだったのに……)

[追記]

古いApacheでは SSLCertificateFile にfullchainを指定してもうまく処理してくれない模様。 で、サーバー証明書だけが送られてきてOSが検証するChrome/Edge/Safariが駄目になり、独自に検証しているFirefoxだけは通ったという感じか。

マニュアル見ると↓になっているので、サーバー証明書以外を含むことも想定されているっぽいんだけどな。

At a minimum, the file must include an end-entity (leaf) certificate.

https://httpd.apache.org/docs/2.2/en/mod/mod_ssl.html#sslcertificatefile