从特定IP获取HTTPS资产并跳过DNS查找

时间:2016-05-16 20:59:59

标签: ssl go https dns

我正在研究一些无法查询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层之前发生吗?我一直在讨论这个问题几个小时,无法弄清楚如何让它发挥作用。

1 个答案:

答案 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")
}