我需要检查一些网站的更新,我的脚本适用于我尝试的所有网站,除了一个。
我很确定它与TLS / SSL有关,但我没有找到任何有关错误的有用信息。
这是脚本:
get_obj_vars
这是输出:
$products
我是否需要添加一些代码来处理握手?为什么网站会向我发送意外消息?
答案 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说明,它们会更彻底)
~/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已经处于测试阶段)。