Ssl Golang问题x509:无法验证签名:算法未在net/http上实现

Ssl Golang问题x509:无法验证签名:算法未在net/http上实现,ssl,https,go,x509,Ssl,Https,Go,X509,我正在编写一个非常简单的Golang脚本,并使用这个库连接我们的内部HTTPS服务器。但我面临以下x509证书问题,不确定如何处理x509证书问题。我们的团队没有机会接触詹金斯,希望知道我们还可以做些什么来进一步挖掘这个问题 $ go run jenkins.go 2014/07/28 22:00:29 [] Get https://jenkins.mydomain.com/api/json: x509: certificate signed by unknown authority (pos

我正在编写一个非常简单的Golang脚本,并使用这个库连接我们的内部HTTPS服务器。但我面临以下x509证书问题,不确定如何处理x509证书问题。我们的团队没有机会接触詹金斯,希望知道我们还可以做些什么来进一步挖掘这个问题

$ go run jenkins.go 
2014/07/28 22:00:29 [] Get https://jenkins.mydomain.com/api/json: x509: certificate signed by unknown authority (possibly because of "x509: cannot verify signature: algorithm unimplemented" while trying to verify candidate authority certificate "MyDomain Internal Root CA")
使用curl:

$ curl -v "https://jenkins.mydomain.com/api/json"
* Adding handle: conn: 0x7f8469004000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f8469004000) send_pipe: 1, recv_pipe: 0
* About to connect() to jenkins.mydomain.com port 443 (#0)
*   Trying 10.38.8.70...
* Connected to jenkins.mydomain.com (10.38.8.70) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
* Server certificate: jenkins.mydomain.com
* Server certificate: MyDomain Server CA - 2014
* Server certificate: MyDomain Internal Root CA
> GET /api/json HTTP/1.1
> User-Agent: curl/7.30.0
> Host: jenkins.mydomain.com
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server nginx is not blacklisted
< Server: nginx
< Date: Tue, 29 Jul 2014 05:03:45 GMT
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: JSESSIONID.214ca1a4=1ry000odf815goiv7vl8tr627;Path=/;Secure
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< X-Jenkins: 1.554.3
< X-Jenkins-Session: c660ff91
$curl-v”https://jenkins.mydomain.com/api/json"
*添加句柄:conn:0x7f8469004000
*正在添加句柄:发送:0
*正在添加句柄:recv:0
*卷曲度加把手尺寸线:长度:1
*-Conn 0(0x7f8469004000)发送管道:1,接收管道:0
*即将连接()到jenkins.mydomain.com端口443(#0)
*正在尝试10.38.8.70。。。
*已连接到jenkins.mydomain.com(10.38.8.70)端口443(#0)
*使用TLS_ECDHE_RSA_和_AES_128_CBC_SHA256的TLS 1.2连接
*服务器证书:jenkins.mydomain.com
*服务器证书:MyDomain服务器CA-2014
*服务器证书:MyDomain内部根CA
>GET/api/json HTTP/1.1
>用户代理:curl/7.30.0
>主持人:jenkins.mydomain.com
>接受:*/*
> 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
目前已在Go中被破坏,它将在v1.4中得到支持,唯一的解决办法是降级TLS MaxVersion

快速查看golang jenkins,它不允许指定要使用的
http.Client
,只使用
http.DefaultClient
,降级TLS最大版本的唯一丑陋方法是覆盖
http.DefaultClient.Transport

在尝试连接到任何对象之前,您应该能够在
func init()
中执行类似操作:

cfg := &tls.Config{
    MaxVersion:               tls.VersionTLS11, // try tls.VersionTLS10 if this doesn't work
    PreferServerCipherSuites: true,
}

http.DefaultClient.Transport = &http.Transport{
    TLSClientConfig: cfg,
}
请记住,这将为直接使用
http.DefaultClient
的任何内容设置传输,例如
http.Get
,但是如果使用自己的实例,就可以了


关于bug的讨论:

谢谢你,伙计!我也怀疑这样的事情,但不知道它在当前版本的Golang中不受支持。我确实尝试过在
func init()
中重写它,甚至在每次
http.DefaultClient.Do
调用之前都尝试过,但仍然不起作用。跳过它会起作用,很奇怪
cfg:=&tls.Config{unsecureskipverify:true}
OK,我很愚蠢。我刚刚发现我仍然在v1.2上,并且升级到v1.3,而你的覆盖技巧仍然有效
unsecureskipverify:true
通常是个坏主意。这就是不安全的
想要告诉你的。笔测试人员(和坏人)喜欢获取开发人员的证书并跳转到其他机器上。