假设我想通过编程获得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

现在,我自己想要信任这个证书(设想一个自颁发的证书,我可以在其中验证 fingerprint 等):我如何发出请求并验证/信任该证书?

我可能需要使用OpenSSL下载证书,将其加载到我的文件中并填充tls.Config个 struct !?

推荐答案

Security note: Disabling security checks is dangerous and should be avoided

您可以对默认客户端的所有请求全局禁用安全判断:

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

Go相关问答推荐

T的Golang通用切片,其中 *T实现接口

你能帮我优化一个golang代码关于函数CrossPointTwoRect

如何将文件从AWS S3存储桶复制到Azure BLOB存储

提供的client_secret与此帐户上任何关联的SetupIntent都不匹配

如果第一次匹配条件,如何跳过切片中的值

使用 Golang 获取目录磁盘使用情况

通过多阶段构建复制到 Docker 容器中时找不到文件

如何判断范围内的字段?

如何将整数哈希细分为范围

拆分文本并按空格获取字符串数组,如果文本长度超过 500,则获取字符串数组

如何仅提取时间作为持续时间

仅在工作日运行 cron

如何在 helm 中将字符串连接到 .AsConfig 的结果?

使用 `didip/tollbooth` 限制每小时最大请求数

有没有办法在一个 goroutine 返回后延迟后取消上下文?

测试包外文件时的 Golang 测试覆盖率

Go模板中的浮点除法

Go 赋值涉及到自定义类型的指针

golangci-lint 的 GitHub 操作失败,无法加载 fmt

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?