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

时间:2016-06-25 22:29:26

标签: ssl go tls1.2 starttls

我正在为我正在处理的项目编写TCP文本协议。协议中的一个命令是STARTTLS,它应该将连接升级到TLS并继续。我升级连接的代码与this question中的答案类似。我遇到的问题是当我升级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,
}

1 个答案:

答案 0 :(得分:0)

您是否在客户端调用c.conn.Handshake()或执行其他操作来启动TLS握手?

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

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