小编典典

在Go中将连接升级到TLS

go

我有一个开放的TCP连接,并像这样的for循环从中读取数据

for {
  // tx.Text is of type textproto.Conn
  // the underlying connection is stored in tx.Conn
  l, err := tx.Text.Reader.ReadLine()

  // do stuff with the text line ...
}

现在,我想像这样将连接升级到TLS(TlsConf包含已加载的证书tls.LoadX509KeyPair

tx.Conn = tls.Server(tx.Conn, tx.Server.Conf.TlsConf)
tx.Text = textproto.NewConn(tx.Conn)

当我这样做时,当服务器尝试握手时,我在客户端上遇到了分段错误。我执行一个SMTP服务器,并正与测试它swaks使用-tls标志。Swaks的终端输出如下

-> STARTTLS
<-  220 Start TLS
Segmentation fault: 11

由于swaks是经过测试的工具,并且可以与我以前使用过的nodeJS SMTP实现一起使用,因此我不怀疑该错误是在客户端。

我做错了什么或缺少了什么?

PS:当从现有的不安全连接启动TLS连接时,究竟发生了什么?客户端是在其他端口上建立新连接还是重新使用该连接?


阅读 276

收藏
2020-07-02

共1个答案

小编典典

沟渠,使用Go自己的smtp.SendMail构建了一个小工具来测试TLS:

package main

import (
  "fmt"
  "net/smtp"
)

func main() {
  err := smtp.SendMail(
    "127.0.0.1:2525",
    nil,
    "src@test.local",
    []string{"dst@test.local"},
    []byte("Hello! Just testing."),
  )
  if err != nil {
    panic(err)
  }
}
2020-07-02