このページについて
passenger-ruby のdocker imageが突然ビルドに失敗するようになったので調査した。
エラーの原因と解決方法についてまとめる。
事象
Dockerのビルド時に 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.
使用していたDockerfile
FROM phusion/passenger-ruby26@sha256:c187cae81ba7b0b3aba0f67f0aad4c24fb1352857dcbaf598301fdd2220ea32f
RUN apt-get update && apt-get install -y shared-mime-info \
&& apt-get clean
・・・
原因
passengerでは証明書に Let's Encrypt を使用しており、その証明書が2021/9/30で期限切れとなった。
docker image 内で新しい証明書である ISRG RootX1
をサポートしていなかったため証明書エラーが発生した。
対処方法
passengerのissueを確認したところ、同事象でのissueが上がっており、ca-certificates
をアップデートすることで解消できるとのこと。
apt update && apt install -y ca-certificates
```
https://github.com/phusion/passenger/issues/2381
しかし、自分の場合はそもそも `apt update` の段階で証明書エラーが発生してしまいアップデートできなかった。
そのため解消方法を漁っていたところ、以下issueを発見。
https://github.com/phusion/passenger-docker/issues/322
```
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
```
`apt update` の前に `/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/` を退避させて読み込まれないようにすることで解決した。