在等待* tls.certificateStatusMsg时收到类型为* tls.serverKeyExchangeMsg的意外握手消息

时间:2018-01-03 09:01:49

标签: ssl go https tls1.2

我需要检查一些网站的更新,我的脚本适用于我尝试的所有网站,除了一个。

我很确定它与TLS / SSL有关,但我没有找到任何有关错误的有用信息。

这是脚本:

get_obj_vars

这是输出:

$products

我是否需要添加一些代码来处理握手?为什么网站会向我发送意外消息?

1 个答案:

答案 0 :(得分:5)

这是Go的TLS握手处理中的一个错误。在1.4版https://github.com/golang/go/issues/8549附近发送了一个补丁。 但是,从1.9.2开始,它尚未应用。

补丁本身清楚地表明在Go的实施中它是一个错误:

// RFC4366 on Certificate Status Request:       
// The server MAY return a "certificate_status" message.

而go TLS客户端基本上是在实现"服务器必须返回..."。

我们可以用一个较小的例子重现问题:

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    _, err := http.Get(os.Args[1])
    fmt.Println(err)
}

跑步:

$ go run foo.go https://jobs-eu.hudson.com
Get https://jobs-eu.hudson.com: tls: received unexpected handshake message of type *tls.serverKeyExchangeMsg when waiting for *tls.certificateStatusMsg

将上述补丁应用于go 1.9.2源并立即重建会产生正确的功能:

~/tmp$ GOROOT=${HOME}/tmp/go go/bin/go run foo.go https://jobs-eu.hudson.com
<nil>

要修补Go,我执行了以下操作:(但您可能需要遵循install from source说明,它们会更彻底)

  • 下载go 1.9.2 source tarball
  • 将其提取到~/tmp/go
  • 应用补丁:~/tmp/go$ patch -p1 < /tmp/OptionalCertificateStatus.patch
  • 重建:~/tmp/go$ GOROOT_BOOTSTRAP=<my previous go install> ./all.bash
  • 如上所述运行

我已经发现了patch issue,我很想知道为什么这个补丁没有被选中。

更新:补丁为now merged。 1.11可能是最早发布的版本(我猜测的基础是1.10已经处于测试阶段)。