Я пишу текстовый протокол TCP для проекта, над которым я работаю. Одна из команд в протоколе - STARTTLS
, которая должна обновить соединение с TLS и продолжить. Мой код для обновления соединения похож на ответ в this question. Проблема, с которой я сталкиваюсь, - это когда я обновляю TLS-соединение, tlsConn.Handshake
будет висеть и никогда не отпускать. Ниже приведены примеры кода. Любая помощь приветствуется.Golang: tls.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,
}
Не могли бы вы проверить с помощью tcpdump или аналогичного инструмента, если клиент отправляет пакет Hello клиента TLS или нет? Это ограничило бы проблему на стороне клиента или сервера. – snap