ruby - ruby docker 图像中的过期 ca 证书(2.6.8-bullseye)

标签 ruby docker ssl ssl-certificate

上周五我开始在这个 docker image 上看到关于 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-certificates.crt。

问题似乎没有任何改善。

运行

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

说没问题,所有 (3) 个绿色勾选

有什么想法吗?

谢谢。

更新

我认为这个问题可能与 lets encrypt expiring their root certificate 有关,我尝试了 first workaround他们建议,通过删除容器上的文件,同时删除 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 上有一个错误会导致问题 https://www.openssl.org/blog/blog/2021/09/13/LetsEncryptRootCertExpire/一些平台已经发布了解决方法修复,您只需要升级最新的 ca 证书和最新的 libgnutls30。如果您能升级到更新的 OpenSSL 就更好了。

关于ruby - ruby docker 图像中的过期 ca 证书(2.6.8-bullseye),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69438081/

相关文章:

ruby-on-rails - 使用服务类中的计算属性构建哈希

ruby-on-rails - 错误率: FasterCSV to hash

docker - Docker网络,从Windows主机连接到linux容器

macos - 在哪里为 Docker for Mac 添加客户端证书?

Python Urllib2 SSL 错误

ruby-on-rails - 如何在较新的 Rails 上用只读替换查找?

ruby - 重新打开 Ruby 类的奇怪问题

Docker-compose 在 WSL 上使用不正确的路径 :\\?\C:\

Docker 容器无法访问本地网络 DNS

networking - whatsapp 使用 wireshark 嗅探 ssl 流量