我正在尝试在 https://github.com/golang/build/tree/master/cmd/coordinator
运行 buildlet有一个本地托管服务器连接始终无法连接并给出错误:
first record does not look like a TLS handshake
失败的代码来自 build/cmd/buildlet/reverse.go,它是:
tcpConn.SetDeadline(time.Now().Add(30 * time.Second))
config := &tls.Config{
ServerName: serverName,
InsecureSkipVerify: devMode,
}
conn := tls.Client(tcpConn, config)
if err := conn.Handshake(); err != nil {
return nil, fmt.Errorf("failed to handshake with coordinator: %v", err)
}
我发现应该建立连接,同时忽略 TLS 问题,因为服务器位于本地主机
我似乎不知道如何解决这个问题。 有关重现我的问题的说明位于上面的链接中。我建议的唯一改变是使用
go run . -mode=dev -listen-http=localhost:8119
对于第一个命令
InsecureSkipVerify
只是意味着 TLS 证书验证约束放宽(达到您的连接不安全且容易遭受 MITM 攻击的程度)
来自文档:
如果 InsecureSkipVerify 为 true,则 crypto/tls 接受服务器提供的任何证书以及该证书中的任何主机名。
您仍然需要在另一端建立使用 TLS 的连接。您收到的错误意味着连接的另一端不支持 TLS。
如果您不想在 devMode 中使用 TLS,那么您应该在 dev 模式下直接使用
tcpConn
,而不用 *tls.Conn
包装它。 *tls.Conn
实现了 net.Conn
,因此在握手之后,无论是否具有 TLS,您使用连接的方式都不应该有任何差异。