繁体   English   中英

Golang:tls.Handshake在连接升级后挂起

[英]Golang: tls.Handshake hangs after connection upgrade

我正在为我正在研究的项目编写TCP文本协议。 协议中的一个命令是STARTTLS ,它应该将连接升级到TLS并继续。 我升级连接的代码类似于这个问题的答案。 我遇到的问题是当我升级TLS连接时, tlsConn.Handshake将挂起并且永不放弃。 下面有一些代码示例。 任何帮助是极大的赞赏。

收到STARTTLS命令后......

// Init a new TLS connection. I need a *tls.Conn type                                                                
// so that I can do the Handshake()                                                                                  
s.Logf("++> Upgrading connection to TLS")
tlsConn := tls.Server(s.Conn, s.Server.TLSConfig)
s.Logf("++> Attempting TLS Handshake")

tlsConn.Handshake()
s.Logf("++> TLS Handshake Successful")

// Here is the trick. Since I do not need to access                                                                  
// any of the TLS functions anymore,                                                                                 
// I can convert tlsConn back in to a net.Conn type                                                                  
s.Conn = net.Conn(tlsConn)

s.Logf("++> Updating read/write buffers")
s.reader = textproto.NewReader(bufio.NewReader(s.Conn))
s.writer = textproto.NewWriter(bufio.NewWriter(s.Conn))

s.Printf("100 SUCCESS")

客户端当前正在发送STARTTLS命令之后立即升级连接......

c.conn = tls.Client(c.conn, clientTLSConfig)

服务器*tls.Config看起来像这样......

// Load the key and certificate - paths are provided in flags.                                                                                           
cert, err := tls.LoadX509KeyPair(flagTLSCert, flagTLSKey)                                                                    
if err != nil {                                                                                                              
    log.Fatal(err)                                                                                                       
}

// Create the TLS config                                                                                                     
tlsConfig := &tls.Config{
    Certificates: []tls.Certificate{cert},
    ClientAuth: tls.VerifyClientCertIfGiven,
    ServerName: fqdn(),
}

客户端*tls.Config看起来像这样......

clientTLSConfig := &tls.Config{
    InsecureSkipVerify: true,
}

你是否打电话给c.conn.Handshake()或做其他事情来启动客户端的TLS握手?

如果客户端没有通过发送TLS客户端Hello来启动握手,则服务器将永远等待它。

这是我最好的猜测,因为你没有提供太多的客户端代码。 同时使用tcpdump进行检查有助于缩小问题(向服务器端或客户端)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM