说我想得到https://golang.org
以编程方式。目前是戈朗。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。配置
结构!?
所有这些答案都是错误的!不要使用unsecureskipverify
处理与主机名不匹配的CN。Go开发人员不明智地坚持不禁用主机名检查(它有合法的用途——隧道、NAT、共享群集证书等),同时也有一些看起来类似但实际上完全忽略证书检查的东西。您需要知道证书是有效的,并且由您信任的证书签名。但在常见情况下,您知道CN与您连接的主机名不匹配。对于这些,请在tls上设置
。如果ServerName
。配置tls。配置。ServerName
==remoteServerCN,则证书检查将成功。这就是你想要的unsecureskipverify
表示没有身份验证;对于中间的人来说,时机已经成熟;违背了使用TLS的目的。
unsecureskipverify
有一个合法用途:使用它连接到主机并获取其证书,然后立即断开连接。如果您将代码设置为使用unsecureskipverify
,这通常是因为您没有正确设置ServerName
(它需要来自一个env-var或其他什么东西-不要为这个要求感到不安…正确地设置它)。
特别是,如果您使用客户端证书并依赖它们进行身份验证,您基本上拥有一个实际上不再登录的假登录。拒绝执行InsecureSkipVerify
的代码,否则您将以艰难的方式了解它的错误!
正确方式(截至Go 1.13)(由以下答案提供):
customTransport := http.DefaultTransport.(*http.Transport).Clone()
customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
client := &http.Client{Transport: customTransport}
原始答复:
这里有一种方法可以做到这一点,而不会丢失DefaultTransport
的默认设置,也不需要根据用户评论发出虚假请求。
defaultTransport := http.DefaultTransport.(*http.Transport)
// Create new Transport that ignores self-signed SSL
customTransport := &http.Transport{
Proxy: defaultTransport.Proxy,
DialContext: defaultTransport.DialContext,
MaxIdleConns: defaultTransport.MaxIdleConns,
IdleConnTimeout: defaultTransport.IdleConnTimeout,
ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout,
TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: customTransport}
较短的方式:
customTransport := &(*http.DefaultTransport.(*http.Transport)) // make shallow copy
customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
client := &http.Client{Transport: customTransport}
警告:仅用于测试/开发目的。其他任何事情,请自担风险!!!
安全注意:禁用安全检查是危险的,应该避免
可以对默认客户端的所有请求全局禁用安全检查:
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)
}
}
问题内容: 说我想以编程方式获取。目前,golang.org(ssl)的证书不正确,因此我将其签发给So: 我得到了(如我所料) 现在,我想自己信任该证书(想象一个可以颁发指纹的自我发行的证书,等等):如何提出请求并验证/信任该证书? 我可能需要使用openssl下载证书,将其加载到我的文件中并填充struct!?。 问题答案: 安全说明:禁用安全检查是危险的,应避免 您可以全局禁用默认客户端的所
问题内容: 我有一台具有通过https运行的rest API的服务器。我想在我的应用程序中调用此rest api,该应用程序在不同的端口中运行,但是由于这是通过https进行的,因此 我有2个文件pulic_key.pem和private_key可用于验证证书。使用golang发送休假请求时如何验证证书?我正在发送休息请求。这就是我现在忽略证书的操作。 问题答案: 您需要将证书的CA添加到传输中,
我可以在不设置代理的情况下执行http或https客户端请求, 这个脚本工作正常,当我请求https url时,我得到一个200 ok,但是如果我设置了代理,脚本: 我总是收到“坏请求”,我看文件:https://golang.org/pkg/net/http/: ...........从Go1.6开始,http包在使用HTTPS时对http/2协议有透明的支持。必须禁用HTTP/2的程序可以通过
问题内容: 我目前正在尝试使用进行多个请求。 我用谷歌搜索了如何做到这一点,答案是使用。 至此,我得到了: 然后我尝试了一个请求,并且一切正常。 然后,我通过cmd创建了一个信任库,并导入了目标网站的证书,使用我的信任库设置并设置的of : 如果我尝试执行Https,则会出现异常。 如果我做同样的事情,但一切正常。 谁能告诉我如何使它起作用?(不用担心,我不会创建任何ddos工具) 提前致谢! P
在做题之前,我找到了一些链接,我一个一个地查了一下,没有一个给我一个解答: 使用Volley熟悉CA HTTPS请求 接受所有SSL证书(无对等证书例外)-Volley和Android(带有自签名证书) node.js(socket.io)socket.io+SSL+自签名CA证书在连接时出错 “手动”导入的自签名证书:使用自签名证书和CA的Android SSL HTTP请求 null 但这段引
嗨,我想用Swift发出Https请求。当前im通过ip地址访问本地服务器。通过访问证书,本地服务器有一个SSL证书。要向服务器发出请求,当前我正在这样做。 我已经在plist中使用了上述代码来发出请求 在plist中,我已经给出了这样的结果,但我仍然得到了这样的错误