1. ホーム
  2. ssl

[解決済み] 不正な証明書でhttpsリクエストを行うには?

2022-04-21 09:09:11

質問

を取得したいとします。 https://golang.org をプログラムすることができます。現在、golang.org (ssl)には悪い証明書があり、その証明書が発行されると *.appspot.com そこで、これを実行すると

package main

import (
    "log"
    "net/http"
)

func main() {
    _, err := http.Get("https://golang.org/")
    if err != nil {
        log.Fatal(err)
    }
}

私は(予想通り)得る

Get https://golang.org/: certificate is valid for *.appspot.com, *.*.appspot.com, appspot.com, not golang.org

さて、私はこの証明書を自分で信頼したいと思います(フィンガープリントなどを検証できる自己発行証明書を想像してください):どのようにリクエストを行い、証明書を検証/信頼することができるでしょうか?

おそらく、openssl を使って証明書をダウンロードし、それを自分のファイルにロードして、そのファイルに tls.Config 構造体!?

解決方法は?

セキュリティに関する注意事項:セキュリティチェックを無効にすることは危険ですので、避けてください。

デフォルトのクライアントのすべてのリクエストに対して、セキュリティチェックをグローバルに無効にすることができます。

package main

import (
    "fmt"
    "net/http"
    "crypto/tls"
)

func main() {
    http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
    _, err := http.Get("https://golang.org/")
    if err != nil {
        fmt.Println(err)
    }
}

クライアントのセキュリティチェックを無効にすることができます。

package main

import (
    "fmt"
    "net/http"
    "crypto/tls"
)

func main() {
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
    client := &http.Client{Transport: tr}
    _, err := client.Get("https://golang.org/")
    if err != nil {
        fmt.Println(err)
    }
}