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问题#57,ruby / 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成功连接,并仍然验证证书(实际上是有效的)?
升级到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中,这似乎也可以使一切正常。