【问题标题】:Geetting connection reset by peer when trying to authenticate to server尝试对服务器进行身份验证时由对等方重置连接
【发布时间】:2019-03-25 01:36:26
【问题描述】:

我正在尝试通过 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:password in 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 中做同样的事情吗?谢谢

【问题讨论】:

    标签: xml sockets go soap tcp


    【解决方案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 禁用此功能以发送请求的更多详细信息。

    【讨论】:

    • conn, err := tls.Dial("tcp", "192.168.x.xx:443", nil) 我用过这个,但我收到了Dial failed: x509: cannot validate certificate for 192.168.x.xx because it doesn't contain any IP SANs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多