2016-06-25 15 views
1

私が取り組んでいるプロジェクトのTCPテキストプロトコルを書いています。プロトコルのコマンドの1つは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

クライアントがTLSクライアントのHelloパケットを送信するかどうかは、tcpdumpなどのツールで確認できますか?それは問題をクライアント側またはサーバー側に絞り込むことになります。 – snap

答えて

0

あなたは(c.conn.Handshakeを呼び出す)、またはクライアント側でTLSハンドシェイクを開始するために何かを行うのですか?

クライアントがTLSクライアントHelloを送信してハンドシェイクを開始しない場合、サーバーは永久に待機します。

これは、クライアント側のコードの多くを提供していないので、これは私の最高の推測です。また、tcpdumpでチェックすることで、問題をサーバー側またはクライアント側に絞り込むのに役立ちます。

関連する問題