我正在使用golang crypto/tls处理自定义的面向行的消息协议。

这种方法在Windows上效果很好:

var fullBuffer string

for {

    // If we're not connected, attempt reconnect
    if this.conn == nil {

        if this.IsSecure() {
            this.conn, err = tls.Dial("tcp", this.GetHostOnly(), nil)
        } else {
            this.conn, err = net.Dial("tcp", this.GetHostOnly())
        }

        if err == nil {
            // log and continue
        }
    }

    // Read from socket into our local buffer (blocking)
    if this.conn != nil {
        readBuff := make([]byte, 4096)
        nbytes, err = this.conn.Read(readBuff)
        if nbytes > 0 {
            fullBuffer += string(readBuff[0:nbytes])
        }
    }

非常简单-在win64上运行良好。

但是,当我尝试在Linux上运行它(debian 8-i386和amd64-都是从Windows进行golang 1.5本机和1.6交叉编译)时,出现以下恐慌:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x4ec8b4]

goroutine 8 [running]:
panic(0x8237780, 0x18522030)
    C:/Go/src/runtime/panic.go:464 +0x326
crypto/tls.(*Conn).Handshake(0x0, 0x0, 0x0)
    C:/Go/src/crypto/tls/conn.go:1023 +0x198
crypto/tls.(*Conn).Read(0x0, 0x18597000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    C:/Go/src/crypto/tls/conn.go:922 +0x5e
mylib.(*MyConnection).worker(0x18512480)
    C:/gopath/src/mylib/mylib.go:342 +0x200

Read调用失败,因为它以某种方式将nil传递给TLS握手。

这是怎么了

而且,为什么这个问题只限于linux?

最佳答案

好的,Linux构建产生错误x509: certificate signed by unknown authority


  • 证书有效
  • crypto/x509/root_unix.go会在/etc/ssl/certs中查找,这是世界可读的
  • ,但openssl s_client挂在-showcerts -verify上,指出我的操作系统网络配置
  • 有问题
    出于某种原因
  • 不管是否输入错误,都将输入以下if
  • ,但是我将其存储为net.Conn而不是指针,因此它不是nil可用的。

  • 称这个解决了,对不起您的声音。希望这个调试故事对将来的人有所帮助

    09-04 15:53
    查看更多