使用Apache 2.2.31的ruby rest-client ipv6请求失败

时间:2017-03-13 01:59:56

标签: ruby apache https ipv6 rest-client

我已经坚持了两天左右......

我使用ruby(版本2.3.3p222)gem rest-client(v2.0.0)向服务器发送带有ipv6 url的GET请求(Apache / 2.2.31):

url =  'https://[fd36:4928:8040:dc10:0000:0000:0000:0160]:8080/resources/1'
resource = RestClient::Resource.new(url, :ssl_version => 'TLSv1', :verify_ssl => false, :headers => {'Authorization' => 'Basic cm9vdDAbCdEfwYXNzMSE='})

resource.get

我得到了400个不良回复,并且正文说:"您的浏览器发送了此服务器无法理解的请求。此外,尝试使用ErrorDocument处理请求时遇到400 Bad Request错误"

但是我可以使用相同参数的curl命令并获得正确的响应,所以我怀疑我的rest-client请求的标题可能有问题。

PS:我还测试了添加'主机'

header: {'Authorization' =>  'Basic cm9vdDAbCdEfwYXNzMSE=', 'host' => '[fd36:4928:8040:dc10:0000:0000:0000:0160]:8080' }

它仍然以同样的不良反应失败。

我刚注意到此请求的appache错误,它说: " httpd [29124]:[错误]主机名fd36:4928:8040:dc10:0000:0000:0000:0160通过SNI提供并提供主机名fd36:4928:8040:dc10:0000:0000:0000通过HTTP是不同的 "

3 个答案:

答案 0 :(得分:0)

您提供的curl命令会将--user admin:password转换为以下标题:

Authorization: Basic YWRtaW46cGFzc3dvcmQ=

但是,您正在发送

Basic: cm9vdDAbCdEfwYXNzMSE=

这不是一回事......所以服务器可能会抱怨没有得到正确的身份验证......

答案 1 :(得分:0)

这似乎是rest-client中的错误或Ruby Net :: HTTP中的回归。

https://github.com/rest-client/rest-client/issues/583

您使用的是哪个版本的Ruby?您是否尝试过使用Ruby 2.1来查看它是否在那里工作?

修改

这是Ruby Bug #12642。发送IPv6地址的Host标头时不会包含[ ]

Ruby in 2.1.6 - 2.1.10没有错误,但版本> = 2.2.0会受到影响。

更糟糕的是,设置明确的IPv6主机标头会出现错误,因此您会收到异常URI::InvalidComponentError: bad component(expected host component): [

答案 2 :(得分:0)

经过调试和谷歌搜索一天后,这个问题似乎很明显:

从类似的错误报告到chrome https://bugs.chromium.org/p/chromium/issues/detail?id=500981," SNI只是主机名,不应包含IP。"。但是,ruby确实使用ip作为主机名(在这种情况下,rest-client没什么可怪的,因为它只是将所有内容委托给ruby lib)。您可以在Net :: HTTP#connect(第922行)附近找到证据:

      # Server Name Indication (SNI) RFC 3546
      s.hostname = @address if s.respond_to? :hostname=

只需注释掉它的最后一行(为了解决这个问题,你必须做一个猴子补丁)。另外,正如@alberge所指出的,主机头不包含括号,最终请求主机头是这样的:" FD36:4928:8040:DC10 :: 162",no" [] "周围。

同样在Apache方面,它做错了,因为它只是从最后一个冒号剥离所有内容而没有任何额外的检查 - 这仍然存在于版本2.4.10中,不确定它是否已修复。