首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL_connect returned=1 errno=0 state=SSLv3读取服务器证书B:证书验证仅在代理时失败

SSL_connect returned=1 errno=0 state=SSLv3读取服务器证书B:证书验证仅在代理时失败
EN

Stack Overflow用户
提问于 2013-10-19 07:57:46
回答 2查看 10.9K关注 0票数 4

这篇文章几乎重复了许多其他帖子,包括连接returned=1 errno=0 state=SSLv2 2/v3读取服务器hello A:未知协议连接returned=1 errno=0 state=SSLv3读取服务器证书B:证书验证失败,但有一个关键区别:“证书验证失败”错误仅在通过SSL代理(查尔斯)代理时才会发生,并且仅在最新版本的查尔斯中发生。

具体来说,这个(非代理)代码工作:

代码语言:javascript
复制
  uri = URI.parse('https://www.ibm.com')
  http = Net::HTTP.new(uri.host, uri.port, nil)
  http.use_ssl = true
  http.start { |agent| agent.get(uri.path) }

此(代理)代码出现“证书验证失败”错误时失败:

代码语言:javascript
复制
  uri = URI.parse('https://www.ibm.com')
  http = Net::HTTP.new(uri.host, uri.port, "localhost", 8888)
  http.use_ssl = true
  http.start { |agent| agent.get(uri.path) }

拼图

错误仅在通过当前版本的Ruby/OpenSSL中的代理时才会出现。特别是:

  • 没有通过代理时没有错误,这导致我认为本地证书是有效的。
  • 在使用Firefox或curl -v https://www.ibm.com/通过代理时没有错误,这使我认为查尔斯证书是有效的。
  • 在较早版本的Ruby / OpenSSL上通过代理没有错误(请参阅下面这两个环境)。

所有这一切让我怀疑是一个实际的Ruby bug,而不是我的证书的问题,但我很高兴看到的不是这样的。

当前环境

我观察到了这个环境中的错误:

代码语言:javascript
复制
$ system_profiler SPSoftwareDataType | grep "System Version"
    System Version: OS X 10.8.5 (12F45)
$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p247 (2013-06-27) [x86_64-darwin12.4.0]
OpenSSL 1.0.1e 11 Feb 2013
http-cookie (1.0.2)
http_router (0.10.2)
net-http-digest_auth (1.4)
net-http-persistent (2.9)
ntlm-http (0.1.1)

以前的环境

此错误不会出现在稍早版本的ruby/OpenSSL中:

代码语言:javascript
复制
$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin10.8.0]
OpenSSL 0.9.8y 5 Feb 2013
http_router (0.11.0, 0.10.2)
httpauth (0.2.0)
net-http-digest_auth (1.2.1)
net-http-persistent (2.8)
ntlm-http (0.1.1)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-05 22:11:49

这里要做的是,Charles不能为您提供"https://www.ibm.com“的有效证书,因为无论您用什么证书设置了Charles (或者如果Charles创建了自己的证书),它都不能用于"www.ibm.com”名称,并且由受信任的证书颁发机构认证。这就是为什么如果客户端验证证书,连接就会失败,如果您跳过验证

代码语言:javascript
复制
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

它可能适用于较早版本的ruby,因为"net/https“在默认情况下仅在最近才被调整为验证证书。

票数 2
EN

Stack Overflow用户

发布于 2013-10-20 02:02:45

我似乎还记得需要指出ENV var中的证书。如果您并不真正关心验证,那么只需:

代码语言:javascript
复制
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19463827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档