在ruby docker image (2.6.8-bullseye)中过期的ca证书



上周五,我开始看到问题(在一个已经运行了几个月的环境中),这个问题是在这个docker镜像上的ruby:

RestClient::SSLCertificateNotVerified: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

然后我继续尝试添加一个自定义PEM (wget https://curl.se/ca/cacert.pem)来链接环境变量SSL_CERT_FILE(如许多其他堆栈溢出问题所述)。

但是我得到:

bash-4.4# wget https://curl.se/ca/cacert.pem
Connecting to curl.se (151.101.2.49:443)
ssl_client: curl.se: certificate verification failed: certificate has expired
wget: error getting response: Connection reset by peer

我试着把文件保存在我的本地机器上,然后把它docker cp到容器,但这也没有帮助。

我试着运行控制台:

bash-4.4# SSL_CERT_FILE=/cacert.pem bundle exec rails c
irb(main):001:0> RestClient.get('https://curl.se/ca/cacert.pem', headers={})
RestClient.get "https://curl.se/ca/cacert.pem", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client/2.0.2 (linux-musl x86_64) ruby/2.3.8p459"
RestClient::SSLCertificateNotVerified: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

我尝试在控制台和dockerfile中手动运行update-ca-certificates,但我得到:

bash-4.4# update-ca-certificates
WARNING: ca-certificates.crt does not contain exactly one certificate or CRL: skipping

当我用cacert尝试这个时。如上所述,将pem复制到容器中,update-ca-certificates也向该文件添加了一个警告,类似于ca证书。crt。

这个问题似乎没有得到任何改善。

运行
curl -Lks 'https://git.io/rg-ssl' | ruby

说一切正常,所有(3)绿色检查

任何想法?

谢谢。<标题>

更新我认为这个问题可能与让加密过期的根证书有关,我尝试了他们推荐的第一个解决方案,通过删除容器上的文件,并在dockerfile上删除它,然后运行update-ca-certificates这也没有帮助。我不确定如何使用其他两个变通方法。

如果您使用的是debian 9,我建议您更新它。否则,这是我对我的图像的变通解决方案。

# Temporarily fix wrong let's encrypt R3 chain because it's chained to an expired old root CA (DST Root CA X3) on debian 9
RUN sed -i -E 's/(.*DST_Root_CA_X3.*)/!1/' /etc/ca-certificates.conf
ADD https://letsencrypt.org/certs/isrgrootx1.pem /usr/local/share/ca-certificates/isrgrootx1.pem
RUN update-ca-certificates 

仅供参考:OpenSSL 1.0.2g有一个bug会导致这个问题https://www.openssl.org/blog/blog/2021/09/13/LetsEncryptRootCertExpire/一些平台已经发布了解决方案,你只需要升级最新的ca证书和最新的libgnutls30。如果你能升级到最新的OpenSSL就更好了。

解决这个问题的方法是在容器的控制台上运行:

apt update && apt install ca-certificates

然而,这将是一个Docker反模式,因为在删除容器时更改将丢失。

更好的方法是从您在问题中链接的Dockerfile(使用docker build)重建映像,然后从新映像删除并重新创建容器。

最新更新