2016-05-16 141 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