Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate.
passenger-ruby のdocker imageが突然ビルドに失敗するようになったので調査した。
Dockerfile
FROM phusion/passenger-ruby26@sha256:c187cae81ba7b0b3aba0f67f0aad4c24fb1352857dcbaf598301fdd2220ea32f RUN apt-get update && apt-get install -y \ libnginx-mod-http-headers-more-filter shared-mime-info \ && apt-get clean ...
事象
apt-get update && apt-get install
時に以下エラーが発生する
Err:5 https://oss-binaries.phusionpassenger.com/apt/passenger bionic Release Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate. Could not handshake: Error in the certificate verification. E: The repository 'https://oss-binaries.phusionpassenger.com/apt/passenger bionic Release' does not have a Release file.
原因
passengerでは証明書にLet's Encryptを使用しており、その証明書が2021/9/30で期限切れとなった。
新しい証明書である ISRG RootX1
をサポートしていなかったため証明書エラーが発生した。
対処方法
ca-certificates
をアップデートすることで解消できるとのこと。
apt update && apt install -y ca-certificates
しかし、自分の場合はそもそも apt-get update
の段階で証明書エラーが発生してしまいアップデートできなかった。
そのため解消方法を漁っていたところ、以下記事を発見。 github.com
apt updateの前に /etc/apt/sources.list.d
を退避させるとうまくいくとのことで、試して見たところビルドに成功した。
RUN mv /etc/apt/sources.list.d /etc/apt/sources.list.d.bak RUN apt update && apt install -y ca-certificates RUN mv /etc/apt/sources.list.d.bak /etc/apt/sources.list.d
修正後のDockerfile
FROM phusion/passenger-ruby26@sha256:c187cae81ba7b0b3aba0f67f0aad4c24fb1352857dcbaf598301fdd2220ea32f RUN mv /etc/apt/sources.list.d /etc/apt/sources.list.d.back RUN apt-get update && apt-get install -y \ libnginx-mod-http-headers-more-filter shared-mime-info \ && apt-get clean RUN mv /etc/apt/sources.list.d.back /etc/apt/sources.list.d ...
まとめ
今回の事象の原因は、Let's Encryptの新しい証明書にコンテナが対応していなかったことだった。
事象を解決するには ca-certificates
の更新が必要。
docker image として使用していた passenger-ruby の場合、/etc/apt/sources.list.d/passenger.list
がデフォルトで含まれているため、 apt update
時にこのファイルが読み込まれ証明書エラーが発生してしまっていた。
そのため ca-certificates
の更新前に /etc/apt/sources.list.d/
を退避させて読み込まれないようにすることで解決した。