我正在使用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
可用的。 称这个解决了,对不起您的声音。希望这个调试故事对将来的人有所帮助