Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby net/imap获取OpenSSL::SSL::SSLError-自签名证书?_Ruby_Ssl_Imap_Gmail Imap - Fatal编程技术网

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

Ruby net/imap获取OpenSSL::SSL::SSLError-自签名证书?,ruby,ssl,imap,gmail-imap,Ruby,Ssl,Imap,Gmail Imap,在尝试开发一个使用IMAP访问Gmail的工具时,我遇到了困难,即使是这个简单的启动代码: 需要“net/imap” imap=Net::imap.new('imap.gmail.com',ssl:true) 运行该命令时,会出现如下故障(注意:为便于显示,会对其进行轻微编辑): 因此,SSL证书似乎确实以这种方式验证为OK(正如人们所期望的那样) 我确实发现在禁用主机检查的情况下使用SSL的net/imap,这很有效。。。但我真的不想那样做 我还发现了一个,但我的目的是一个也可以与其他IMA

在尝试开发一个使用IMAP访问Gmail的工具时,我遇到了困难,即使是这个简单的启动代码:

需要“net/imap”
imap=Net::imap.new('imap.gmail.com',ssl:true)
运行该命令时,会出现如下故障(注意:为便于显示,会对其进行轻微编辑):

因此,SSL证书似乎确实以这种方式验证为OK(正如人们所期望的那样)

我确实发现在禁用主机检查的情况下使用SSL的
net/imap
,这很有效。。。但我真的不想那样做

我还发现了一个,但我的目的是一个也可以与其他IMAP提供商一起使用的工具,所以我的目标是在这里坚持使用IMAP。因此:

如何让
net/imap
使用SSL成功连接,并且仍然验证证书(假设它实际上是有效的)?

理想:升级到Ruby 2.6.3或更高版本 升级到Ruby版本2.6.3或更高版本应该可以解决问题,因为为提供了修复的Ruby版本被合并到了。在2.6.3中,问题中的原始测试片段现在可以工作了

如果无法升级: 也就是说,如果出于某种原因升级不可行,则提供了一种变通解决方案。而不是以下内容:

imap=Net::imap.new('imap.gmail.com',ssl:true)
试试这个:

imap=Net::imap.new('imap.gmail.com',ssl:{ssl_version::TLSv1_2})

即使在Ruby 2.6.0中,这似乎也能起作用。

在Ruby 2.4中,我不得不使用以下补丁:

需要“net/imap”
类Net::IMAP
模块UseSNI
def start_tls_会话(*)
@sock.instance_variable_set(:@hostname,@host)
超级的
终止
终止
预加乌塞斯尼
终止
类OpenSSL::SSL::SSLSocket
模块UseSNI
def connect(*)
self.hostname=io.instance\u variable\u get(:@hostname)
超级的
终止
终止
预加乌塞斯尼
终止
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)
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