wancoro blog

学んだことをアウトプットしていきたいと思います

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 をサポートしていなかったため証明書エラーが発生した。

letsencrypt.org

対処方法

ca-certificates をアップデートすることで解消できるとのこと。

apt update && apt install -y ca-certificates

github.com

しかし、自分の場合はそもそも 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/ を退避させて読み込まれないようにすることで解決した。