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

时间:2018-10-20 10:18:22

标签: xml sockets go soap tcp

我正在尝试通过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主机:   192.xxx.xx.xx内容类型:text / xml; charset = utf-8授权:基本{username:base64中的密码}内容长度:405   SOAPAction:“ 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中做同样的事情吗?谢谢

1 个答案:

答案 0 :(得分:1)

从事实来看,您的服务器使用端口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提供的大多数安全性。您可以检查this answer,以了解更多详细信息,以禁止使用net.http发送请求。< / p>