2016-06-25 2 views
1

Я пишу текстовый протокол 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, 
} 
+0

Не могли бы вы проверить с помощью tcpdump или аналогичного инструмента, если клиент отправляет пакет Hello клиента TLS или нет? Это ограничило бы проблему на стороне клиента или сервера. – snap

ответ

0

Вы называете c.conn.Handshake() или что-то еще, чтобы инициировать рукопожатия TLS на стороне клиента?

Если клиент не инициирует рукопожатие, отправив клиент TLS Hello, сервер будет сидеть навечно в ожидании его.

Это мое лучшее предположение, поскольку вы не указали большую часть кода на стороне клиента. Также проверка с помощью tcpdump поможет уменьшить проблему (на стороне сервера или клиента).

Смежные вопросы