我正在为我正在处理的项目编写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,
}
答案 0 :(得分:0)
您是否在客户端调用c.conn.Handshake()或执行其他操作来启动TLS握手?
如果客户端没有通过发送TLS客户端Hello来启动握手,则服务器将永远等待它。
这是我最好的猜测,因为您没有提供太多的客户端代码。同时使用tcpdump进行检查有助于缩小问题范围(向服务器端或客户端)。