我正在研究一些无法查询DNS的设备的代码。我只有端口80和443可用。
以下工作,但当然命中DNS。使用的域名是我的个人域名,而不是问题所涉及的真实域名 - 它是与工作相关和编辑的。这只是用来说明问题。
package main
import (
“log”
“net/http”
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(“GET”, “https://donatstudios.com/images/Spacecat/spacecat.svg”, nil)
if err != nil {
log.Fatal(err)
}
_, err = client.Do(req)
if err != nil {
log.Fatal(err)
}
log.Fatal(“no errors”)
}
我将代码更改为命中特定的IP地址ala:
package main
import (
“log”
“net/http”
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(“GET”, “https://162.243.23.224/images/Spacecat/spacecat.svg”, nil)
if err != nil {
log.Fatal(err)
}
req.Host = “donatstudios.com”
_, err = client.Do(req)
if err != nil {
log.Fatal(err)
}
log.Fatal(“no errors”)
}
现在收到“无法验证162.243.23.224的证书,因为它不包含任何IP SAN”
当不使用https域时,上述代码可以正常运行。
据推测,这与SSL有关。 #go-nuts告诉我他们相信这会在它进入HTTP层之前发生吗?我一直在讨论这个问题几个小时,无法弄清楚如何让它发挥作用。
答案 0 :(得分:2)
我假设您的服务器正在使用SNI,例如示例中使用的SNI。试一试,看看它是否适合你。
package main
import (
"crypto/tls"
"log"
"net/http"
)
func main() {
tlsConfig := &tls.Config{
ServerName: "moupon.co",
}
tlsConfig.BuildNameToCertificate()
transport := &http.Transport{TLSClientConfig: tlsConfig}
client := &http.Client{Transport: transport}
req, err := http.NewRequest("GET", "https://216.239.32.21/s/img/logo.png", nil)
if err != nil {
log.Fatal(err)
}
req.Host = "moupon.co"
_, err = client.Do(req)
if err != nil {
log.Fatal(err)
}
log.Fatal("no errors")
}