私が取り組んでいるプロジェクトの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,
}
クライアントがTLSクライアントのHelloパケットを送信するかどうかは、tcpdumpなどのツールで確認できますか?それは問題をクライアント側またはサーバー側に絞り込むことになります。 – snap