2016-05-16 10 views
2

DNSを照会できないデバイス用のコードをいくつか作成しています。私はポート80と443しか利用できません。特定のIPからHTTPSアセットを取得し、DNSルックアップをスキップ

次のように動作しますが、もちろんDNSに当てはまります。使用されるドメインは私の個人的なドメインであり、実際のドメインではありません。それは仕事に関連して編集されたものです。これは単に問題を説明するために使用されます。

「それは任意のIP SANを含んでいないので、162.243.23.224のための証明書を検証することはできません」

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”) 
} 

そして今受け取る:

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を打つために、コードを変更します

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

関連する問題