You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行Go buildlet时tls.Client TLS握手报错如何排查

问题根因

报错first record does not look like a TLS handshake和TLS证书校验逻辑无关,本质是客户端向明文HTTP服务端口发送了TLS握手请求。
你启动服务时指定的-listen-http=localhost:8119是明文HTTP监听端口,该端口不会处理TLS协议报文。buildlet建立反向连接时默认会先发起TLS握手,向这个明文端口发送二进制格式的TLS ClientHello报文,服务端识别到不是合法HTTP请求会直接返回明文格式的错误响应,客户端收到的响应完全不符合TLS握手报文格式,就会抛出该错误。
代码中InsecureSkipVerify: devMode配置仅在TLS通道成功建立后才会生效,作用是跳过证书合法性校验,当前场景下TLS握手在最开始的报文识别阶段就失败了,根本不会走到证书校验逻辑,所以开dev模式也没法解决这个问题。

排查思路
  • 核对端口协议匹配性:服务启动后,通过端口监听工具确认目标端口的服务协议,同时抓包查看对应端口的交互流量,会看到客户端发送二进制TLS握手帧后,服务端返回明文HTTP格式的400错误响应,直接确认是端口协议不匹配。
  • 核对启动参数含义:-listen-http参数对应的是明文HTTP服务端口,dev模式下处理TLS反向连接的端口是独立配置项,不会和HTTP端口复用,将反向连接地址指向HTTP端口必然触发协议不匹配错误。
  • 核对dev模式连接逻辑:dev模式仅会关闭TLS证书校验,不会自动将TLS连接降级为明文连接,不会适配明文端口的通信逻辑。
修复方案

二选一即可:

  • 方案1(推荐,无需改代码):启动coordinator时单独指定dev模式下的HTTPS监听端口,不要将反向连接地址指向HTTP端口。调整后的启动命令如下:
go run . -mode=dev -listen-http=localhost:8119 -listen-https=localhost:8443

后续配置buildlet反向连接地址时,填写localhost:8443即可。dev模式下coordinator会自动生成本地自签名证书,buildlet开启了跳过证书校验配置,可正常完成TLS握手建立连接。

  • 方案2(仅适合本地临时调试):如果本地调试不想走TLS,修改buildlet反向连接逻辑,dev模式下直接使用明文TCP连接,不发起TLS握手。对应reverse.go的代码调整如下:
tcpConn.SetDeadline(time.Now().Add(30 * time.Second))
var conn net.Conn
if devMode {
    conn = tcpConn
} else {
    config := &tls.Config{
        ServerName:         serverName,
        InsecureSkipVerify: devMode,
    }
    tlsConn := tls.Client(tcpConn, config)
    if err := tlsConn.Handshake(); err != nil {
        return nil, fmt.Errorf("failed to handshake with coordinator: %v", err)
    }
    conn = tlsConn
}

注意该修改仅可用于本地调试,不要合入正式代码分支。

内容的提问来源于stack exchange,提问作者gopher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:45:33