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 SSL_connect返回=1 errno=0 state=SSLv3读取服务器证书B:证书验证仅在代理时失败_Ruby_Ssl_Openssl_Net Http_Charles Proxy - Fatal编程技术网

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

Ruby SSL_connect返回=1 errno=0 state=SSLv3读取服务器证书B:证书验证仅在代理时失败,ruby,ssl,openssl,net-http,charles-proxy,Ruby,Ssl,Openssl,Net Http,Charles Proxy,这篇文章几乎重复了许多其他文章,包括和,但有一个关键区别:“证书验证失败”错误仅在通过SSL代理()代理时发生,并且仅在最新版本的Ruby中发生 具体而言,此(非代理)代码工作: 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) } 此(代

这篇文章几乎重复了许多其他文章,包括和,但有一个关键区别:“证书验证失败”错误仅在通过SSL代理()代理时发生,并且仅在最新版本的Ruby中发生

具体而言,此(非代理)代码工作:

  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) }
此(代理)代码失败,出现“证书验证失败”错误:

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

  • 不通过代理时没有错误,这使我认为本地证书是有效的
  • 使用Firefox或
    curl-v检查代理时没有错误https://www.ibm.com/
    ,这让我认为查尔斯证书是有效的
  • 在较早版本的Ruby/OpenSSL上通过代理不会出错(这两个环境见下文)
所有这些都让我怀疑是一个真正的Ruby bug,而不是我的证书有问题,但我很乐意看到其他的情况

当前环境 我正在观察此环境中的错误:

$ 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稍旧的版本不会出现此错误:

$ 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)

我似乎记得需要指出环境变量中的证书。如果您不真正关心验证,那么只需:

http.verify_mode = OpenSSL::SSL::VERIFY_NONE

这里发生的情况是,Charles无法为您提供“”的有效证书,因为您为Charles设置的任何证书(或者如果Charles创建了自己的证书)都不能是“www.ibm.com”名称的证书,并且不能由可信的证书颁发机构进行认证。这就是为什么当客户端验证证书时连接会失败,而当您跳过验证时连接会工作

http.verify_mode = OpenSSL::SSL::VERIFY_NONE
它可能与旧版本的ruby一起工作,因为“net/https”经过了调整以进行验证
默认情况下,证书是最近才安装的。

您是否安装了Charles CA证书?(从“帮助”菜单中)@pguardiario是。(我不认为Charles会使用FireFox和curl,否则…)你是ssl代理吗(又名mitm代理)@pguardiario:没错。我正在开发一个自动登录SSL站点的脚本,所以我使用Charles来记录交互。这是可行的,但我不知道为什么。我的印象是,它是提供证书的代理——哪个证书是http代理验证的(在本例中是不验证的)?这是一个好问题。我一直认为这是ruby和Charles之间的最初联系。我已经将复选标记切换到您的答案,因为它是完整的,并且提供了一个解释,解释了为什么它会这样做。谢谢。@Tanel:我想请你小声点。是的:我知道关闭证书验证意味着什么。我甚至在回答中(在一定程度上)解释了这一点。然而OP想知道ruby版本之间的区别,我会确切地告诉你。
http.verify_mode = OpenSSL::SSL::VERIFY_NONE