【发布时间】:2019-05-09 18:34:40
【问题描述】:
在尝试开发一个使用 IMAP 访问 Gmail 的工具时,即使是这个简单的启动代码,我也遇到了困难:
require 'net/imap'
imap = Net::IMAP.new('imap.gmail.com', ssl: true)
运行,失败如下(注意:为了便于展示,略作编辑):
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)
四处搜索,我发现了一些类似的问题,例如imap-backup issue #57、ruby/openssl issue #238(在撰写本文时仍然开放在分享下面的答案后关闭)和rbenv/ruby-build issue #380...但没有任何内容。
将以上资源中的信息拼凑在一起,我想出了这个命令来尝试:
openssl s_client -connect imap.gmail.com:993 \
-CAfile $(ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE') \
< /dev/null > /dev/null
哪些报告:
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
因此,SSL 证书似乎确实以这种方式验证为 OK(正如人们所期望的那样)。
我确实找到了some instructions,因为它在禁用主机检查的情况下使用带有 SSL 的 net/imap,这是可行的……但我真的不想这样做。
我还找到了non-IMAP gmail interface,但我的意图是一个也可以与其他 IMAP 提供程序一起使用的工具,所以我特别打算在这里坚持使用 IMAP。所以:
我怎样才能让net/imap 使用 SSL 成功连接,并且仍然验证证书(假设它实际上是有效的)?
【问题讨论】:
标签: ruby ssl imap gmail-imap