如何使用HTTP“主机”标头(使用GoLang)定位特定的应用程序服务器

时间:2013-12-20 20:34:32

标签: python ssl https dns go

问题:

为什么我不能使用GoLang中的请求URL中的IP地址和主机名作为“主机”标头来定位服务器? 为什么同样的东西使用python? (2.7.6 - urllib2)

背景:

我正在编写一个系统测试,它会将HTTP请求发送到我正在测试的几个特定应用服务器,并检查结果是否正确。每个应用程序服务器都具有相同的功能,并应返回相同的响应数据。这些服务器分组在负载均衡器后面。然后,DNS将解析这些负载平衡器,并根据需要将流量转发到后端服务器。为了独立定位每个服务器(对于测试),我使用URL中的每个服务器的IP地址而不是通常的主机名,并且我将“主机”HTTP标头设置为通常在URL中的主机名。这是为了确保SSL证书 可以解码安全(HTTPS)请求。

当前状态:

我已经有一个发送这些测试请求的python脚本。以下是该脚本的基本概念:

headers = {"Host": "<hostname>"} # this <hostname> is usually what would go in the URL on the next line
request = urllib2.Request('https://<ip-address>/path?query=123', headers=headers)
response = urllib2.urlopen(request)
# etc... 

这段代码已经好几个月了。我已经验证它确实针对的是基于IP地址的正确服务器。

目标:

我想在golang中复制这个脚本以利用go的并发功能。我使用go的原因是我想一次发送更多请求(使用goroutines)。

问题:

使用与上面所示相同的技术(但在Go中)我收到以下错误:

Get https://<ip-address>/path?query=123: x509: cannot validate certificate for <ip-address> because it doesn't contain any IP SANs

以下是我编写的代码示例:

request, _ := http.NewRequest("GET", "https://<ip-address>/path?query=123", nil)
request.Header.Set("Host", "<hostname>")

client := &http.Client{}
response, err := client.Do(request)
// etc...

同样,为什么在GoLang代码返回错误时python代码有效?

1 个答案:

答案 0 :(得分:2)

根据python documentation

  

警告:HTTPS请求不会对服务器的证书进行任何验证。

要在Go中复制此行为,请参阅:https://stackoverflow.com/a/12122718/216488