有效证书上的 Rails SSL 证书错误

Jul*_*ien 5 openssl ruby-on-rails lets-encrypt

我有一个小型 Rails 应用程序,可以在我们的平台上执行各种检查,并在出现问题时向我发送电子邮件。一切都运行良好,直到今天我开始收到有关以下错误的警报:

SSL_connect returned=1 errno=0 state=error: certificate verify failed (certificate has expired)
Run Code Online (Sandbox Code Playgroud)

现在的问题是,有问题的证书是有效的,它会自动更新(让我们加密),并且此代码已经好几年没有被修改过,之前从未出现过任何问题,突然之间就开始发生这种情况。

抛出异常的代码:

def get_request url
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  #more than 10 seconds this is too slow
  http.open_timeout = 10
  http.read_timeout = 10

  request = Net::HTTP::Get.new(uri.request_uri)
  response = http.request(request)

  if response.code.to_i == 200
    return true
  else
    puts "Failed to GET #{url}: #{response.code.to_i}"
    return false
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我在浏览器中打开该站点,它会显示安全连接,没有问题,并显示正在使用有效的证书,此外,如果我检查,certbot我会得到以下信息:Expiry Date: 2021-11-22 17:48:58+00:00 (VALID: 52 days)很明显,证书是有效的,为什么 Rails 突然发脾气它?

请注意,我已经重新启动了 Nginx,以防万一,但这没有帮助。

其他信息:Ubuntu 16.04.5、OpenSSL 1.0.2g 2016 年 3 月 1 日、Rails 4.2、Ruby 2.6.5

编辑:

使用不同的 url(也具有有效证书)也会发生此错误。

编辑2:

我已经隔离了该问题,它与已过期的 Let's Encrypt DST Root CA X3 有关。很多人都在处理这个问题,一旦找到解决方案,我会报告我的解决方案。

Jul*_*ien 7

因此,在阅读了 Let's Encrypt 社区的这个长帖子之后,我的案例的解决方案最终是删除证书DST Root CA X3

sudo rm /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
sudo update-ca-certificates
Run Code Online (Sandbox Code Playgroud)

之后 openssl 就不再出现错误。