尝试向服务器进行身份验证时由对等方重置连接



我正在尝试通过Go客户端验证自己。这是我到目前为止所做的

func main() {
servAddr := "192.168.7.13:443"
tcpAddr, err := net.ResolveTCPAddr("tcp", servAddr)
if err != nil {
fmt.Println("ResolveTCPAddr failed:", err.Error())
os.Exit(1)
}
conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
fmt.Println("Dial failed:", err.Error())
os.Exit(1)
}
_, err = conn.Write([]byte(postReq))
if err != nil {
fmt.Println("Write to server failed:", err.Error())
os.Exit(1)
}
fmt.Println(postReq)
reply := make([]byte, 1024)
_, err = conn.Read(reply)
if err != nil {
fmt.Println("Write to server failed:", err.Error())
os.Exit(1)
}
fmt.Println("reply from server=", string(reply))
conn.Close()
}

这是我写给连接的消息:

POST/ManagementServer/ServerCommandService.svc HTTP/1.1 Host: 192.xxx.xx.xx 内容类型:文本/xml;字符集=utf-8 授权:基本 {用户名:base64 中的密码} 内容长度:405 肥皂:"http://videoos.net/2/XProtectCSServerCommand/IServerCommandService/Login" 连接:保持活动状态 190FC316-6412-41C4-8A9C-D468CC7BEE9D

在此之后,我希望获得身份验证令牌,但相反,我得到了一个

> Write to server failed: read tcp server-ip:port->server-ip:443:
> read: connection reset by peer

我做错了什么? 仅供参考,我在 python 中使用相同的消息,并且使用套接字我能够获得令牌。有人可以帮助我在 Go lang 中做同样的事情吗?谢谢

从您的服务器使用端口443的事实来看,我假设服务器需要TLS连接。要获得这样的连接,您可以使用tls.Dial

conn, err := tls.Dial("tcp", servAddr, nil) // servAddr not tcpAddr

此连接将处理 TLS 加密所需的基本步骤,如 TLS 握手,并允许您Write要发送的字节,而不必自己进行加密。

正如您提到的证书验证错误,使用

conn, err := tls.Dial("tcp", servAddr, &tls.Config{InsecureSkipVerify: true}) 

将禁用此验证。请注意,这会删除 TLS 提供的大部分安全性。

需要注意的是,我建议您使用net/http来发送简单的HTTP请求。要在此处禁用证书验证,您可以使用

http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}

但同样,请注意,这会删除 TLS 提供的大部分安全性。您可以查看此答案以获取有关使用net.http禁用请求发送此功能的更多详细信息。

最新更新