Ruby OpenSSL 错误 - 缺少 CA 证书(Justin 是谁?)

Posted

技术标签:

【中文标题】Ruby OpenSSL 错误 - 缺少 CA 证书(Justin 是谁?)【英文标题】:Ruby OpenSSL Errors - Missing CA Certs (Who is Justin?) 【发布时间】:2015-07-18 20:39:34 【问题描述】:

我正在编写一个小实用程序脚本,在 Windows 上使用 Ruby 的 Net::HTTP 模块通过 HTTPS 处理一些 RESTful API。我一直收到此错误:

C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
    from C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:923:in `block in connect'
    from C:/Ruby22-x64/lib/ruby/2.2.0/timeout.rb:74:in `timeout'
    from C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:923:in `connect'
    from C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
    from C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:852:in `start'
    from C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:1375:in `request'

根据this post,我缺少默认的 CA 证书。我运行了他的“ssl医生”脚本,它给了我这个诊断:

C:\Users\Megaflux\Documents\GitHub\Github_Backup> ruby doctor.rb
C:/Ruby22-x64/bin/ruby (2.2.2-p95)
OpenSSL 1.0.1l 15 Jan 2015: C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1.0.1l/ssl
SSL_CERT_DIR=""
SSL_CERT_FILE=""

HEAD https://status.github.com:443
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

The server presented a certificate that could not be verified:
  subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
  issuer: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
  error code 20: unable to get local issuer certificate

Possible causes:
  `C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1.0.1l/ssl/cert.pem' does not exist
  `C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1.0.1l/ssl/certs/' is empty

我可以下载一些根 CA 证书并将它们安装在该目录中,这并不难。但贾斯汀是谁?我的机器上没有该用户,如果不需要,我宁愿不创建这些文件夹。有谁知道如何更改默认的 ssl 证书目录?

非常感谢。

编辑: 为了完整起见,我将在此处抛出生成错误的脚本

require 'open-uri'
open("https://www.google.com/") |f|
   f.each_line |line| p line

【问题讨论】:

嗨,我是 Justin =) 说真的,虽然这个问题经常出现。 【参考方案1】:

RubyInstaller issue #153

带有个人硬编码路径的 OpenSSL::X509::DEFAULT_CERT_FILE

问题在于具有硬编码值的 OpenSSL。搜索关闭 问题以及 RubyInstaller 组,并将看到这种情况发生在 时不时的。

OpenSSL 需要修复,但没有解决此问题的补丁 建议 OpenSSL 本身。见oneclick/rubyinstaller#47

cert.pem 已经由 RubyGems 提供并包含在内,请采纳 看这里:

https://github.com/ruby/ruby/tree/ruby_2_0_0/lib/rubygems/ssl_certs

这是 Ruby 的一部分,因此是 RubyInstaller 版本。

RubyGems 能够从 ruby​​gems.org 安装 gem,但是, 就像您在 Bundler 问题中指出的那样,您需要其他 CA 的列表,所以 连接到私有/自定义 RubyGems 服务器工作正常。

为此,您需要设置SSL_CERT_FILE 环境变量指向 到 CA 证书文件。

见oneclick/rubyinstaller#86和oneclick/rubyinstaller#148

tl;dr:Justin 是编译您的 OpenSSL 二进制文件的人。

【讨论】:

是的,我刚刚读到了。我是个笨蛋,直到现在我才想到在我的 Google 越狱中搜索实际路径“C:\Users\Justin” 不过,我会把这个问题留给后代。 仅供参考,供任何寻求调试的人将其引至此处,请注意,尽管问题表明设置 SSL_CERT_FILE 环境变量可以解决问题,但这不适用于所有版本的 SSL,即它不适用于我通过 Rails Installer 安装的 Ruby 2.1.8 这不仅仅是为了后代。一些 gem(例如 Zendesk App Tools)仍然依赖于旧版本的 Ruby,显然没有固定的 RubyInstaller。

以上是关于Ruby OpenSSL 错误 - 缺少 CA 证书(Justin 是谁?)的主要内容,如果未能解决你的问题,请参考以下文章

openssl创建私有CA

使用openssl生成/签发证书的原理流程与示例

使用OpenSSL生成/签发证书的原理流程与示例

用openssl生成的ssl证书和付费的有啥区别

Android7.0以上 安装Ca证书

错误:缺少 OpenSSL 库?在尝试安装python时