Получение сброса соединения одноранговым узлом при попытке аутентификации на сервере - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь идентифицировать себя через клиент 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 Content-Type: text / xml;charset = utf-8 Авторизация: Basic {имя пользователя: пароль в base64} Длина содержимого: 405 SOAPAction: "http://videoos.net/2/XProtectCSServerCommand/IServerCommandService/Login" Соединение: Keep-Alive 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 голосов
/ 20 октября 2018

Судя по тому, что ваш сервер использует порт 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.

...