Ruby Net / imap获取OpenSSL :: SSL :: SSLError-自签名证书?

lin*_*des 0 ruby ssl imap gmail-imap

在尝试开发一种使用IMAP访问Gmail的工具时,即使使用以下简单的启动代码,我也遇到了麻烦:

require 'net/imap'
imap = Net::IMAP.new('imap.gmail.com', ssl: true)
Run Code Online (Sandbox Code Playgroud)

运行该命令将失败,如下所示(注意:对其进行了轻松编辑,以便于显示)

Traceback (most recent call last):
        5: from test-imap:2:in `<main>'
        4: from test-imap:2:in `new'
        3: from /.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/imap.rb:1092:in `initialize'
        2: from /.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/imap.rb:1533:in `start_tls_session'
        1: from /.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/protocol.rb:44:in `ssl_socket_connect'
/.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/protocol.rb:44:in
  `connect_nonblock': SSL_connect returned=1 errno=0 state=error:
  certificate verify failed (self signed certificate) (OpenSSL::SSL::SSLError)
Run Code Online (Sandbox Code Playgroud)

到处搜寻,我发现一些类似的问题,例如imap-backup问题#57ruby / openssl问题#238截至本文撰写时仍开放在分享下面的答案后关闭),以及rbenv / ruby​​-build问题#380 ...但一无所获。

将上述资源中的信息拼接在一起,我想出了以下命令来尝试:

Traceback (most recent call last):
        5: from test-imap:2:in `<main>'
        4: from test-imap:2:in `new'
        3: from /.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/imap.rb:1092:in `initialize'
        2: from /.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/imap.rb:1533:in `start_tls_session'
        1: from /.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/protocol.rb:44:in `ssl_socket_connect'
/.../.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/net/protocol.rb:44:in
  `connect_nonblock': SSL_connect returned=1 errno=0 state=error:
  certificate verify failed (self signed certificate) (OpenSSL::SSL::SSLError)
Run Code Online (Sandbox Code Playgroud)

哪个报告:

depth=2 /OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
verify return:1
depth=1 /C=US/O=Google Trust Services/CN=Google Internet Authority G3
verify return:1
depth=0 /C=US/ST=California/L=Mountain View/O=Google LLC/CN=imap.gmail.com
verify return:1
DONE
Run Code Online (Sandbox Code Playgroud)

因此,似乎SSL证书确实以这种方式验证为“正常”(正如您可能期望的那样)。

我确实找到了一些有关net/imap在禁用主机检查的情况下使用SSL的说明,该方法可以工作...但我真的不希望这样做。

我还找到了一个非IMAP gmail界面,但我的意图是也可以将其与其他IMAP提供程序一起使用的工具,因此我的主要目的是在此处坚持使用IMAP。所以:

我如何才能net/imap使用SSL成功连接,并仍然验证证书(实际上是有效的)?

lin*_*des 5

理想:升级到Ruby 2.6.3或更高版本

升级到Ruby 2.6.3或更高版本应该可以解决问题,因为ruby pull#2077(已为相关问题#15594提供了修复)已合并到2.6.3更改列表中。使用2.6.3,现在可以使用问题中的原始测试代码段。

如果无法升级:

就是说,如果由于某种原因无法进行升级,则修复了imap-backup问题#57提交提供了一种解决方法。代替以下内容:

imap = Net::IMAP.new('imap.gmail.com', ssl: true)
Run Code Online (Sandbox Code Playgroud)

尝试这个:

imap = Net::IMAP.new('imap.gmail.com', ssl: {ssl_version: :TLSv1_2})
Run Code Online (Sandbox Code Playgroud)

即使在Ruby 2.6.0中,这似乎也可以使一切正常。