当前位置: 首页 > 知识库问答 >
问题:

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

全丰
2023-03-14

这篇文章几乎重复了许多其他帖子,包括Rails 4和Ruby 2 Net/HTTP SSL请求: OpenSSL::SSL::SSLError:SSL_connect返回=1 errno=0 state=SSLv2/v3读取服务器你好:未知协议和SSL_connect返回=1errno=0 state=SSLv3读取服务器证书B:证书验证失败,但有一个关键区别:证书验证失败错误仅在通过SSL代理(Charles)代理时发生,并且仅在最新版本的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) }

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

  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-vhttps://www.ibm.com/通过代理时没有错误,这让我认为查尔斯证书是有效的。
  • 在Ruby/OpenSSL的早期版本上,通过代理没有错误(参见下面的两个环境)。

所有这些都让我怀疑是一个真正的Ruby错误,而不是我的证书有问题,但我很乐意看到其他情况。

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

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

共有2个答案

金成济
2023-03-14

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

http.verify_mode = OpenSSL::SSL::VERIFY_NONE
习和通
2023-03-14

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

http.verify_mode = OpenSSL::SSL::VERIFY_NONE

它可能与旧版本的ruby一起工作,因为“net/https”只是在最近才被调整为默认验证证书。

 类似资料: