2016-05-16 139 views
2

我正在处理某些设备的代码,这些设备无法查询DNS。我将只有端口80和443可用。从特定IP获取HTTPS资产并跳过DNS查找

以下工作,但当然命中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

您的服务器是否使用SNI(https://en.wikipedia.org/wiki/Server_Name_Indication)? – Sean

回答

2

我假设你的服务器正在使用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") 
} 
+0

在测试域和真实域上都可以**完美**。谢谢! – donatJ