为什么 tls.Client 失败并显示消息:第一条记录看起来不像 TLS 握手

问题描述 投票:0回答:1

我正在尝试在 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

对于第一个命令

go ssl tls1.2
1个回答
0
投票

InsecureSkipVerify
只是意味着 TLS 证书验证约束放宽(达到您的连接不安全且容易遭受 MITM 攻击的程度)

来自文档

如果 InsecureSkipVerify 为 true,则 crypto/tls 接受服务器提供的任何证书以及该证书中的任何主机名。

您仍然需要在另一端建立使用 TLS 的连接。您收到的错误意味着连接的另一端不支持 TLS。

如果您不想在 devMode 中使用 TLS,那么您应该在 dev 模式下直接使用

tcpConn
,而不用
*tls.Conn
包装它。
*tls.Conn
实现了
net.Conn
,因此在握手之后,无论是否具有 TLS,您使用连接的方式都不应该有任何差异。

© www.soinside.com 2019 - 2024. All rights reserved.