为什么我不能使用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代码有效?
答案 0 :(得分:2)
根据python documentation:
警告:HTTPS请求不会对服务器的证书进行任何验证。
要在Go中复制此行为,请参阅:https://stackoverflow.com/a/12122718/216488