Время ожидания MessageWebSocket ConnectAsync при использовании TLS 1.2 и самозаверяющих сертификатов - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь отправить несколько байтов через соединение Socket на сервер, используя TLS 1.2 и самозаверяющие сертификаты в приложении UWP.

Я пытаюсь использовать приведенный ниже код, но получаю ошибку: Информация WinRT: Тайм-аут операции при выполнении строки webSocket.ConnectAsync.

С Wireshark я вижу, что TLS-рукопожатие инициируется с правильным IP-адресом и номером порта.

private static MessageWebSocket messageWebSocket;
    private static DataWriter messageWriter;

    public static async Task<bool> SocketControl()
    {
        try
        {
            //creates a new MessageWebSocket and connects to WebSocket server and sends data to server

            //Make a local copy
            MessageWebSocket webSocket = messageWebSocket;

            //Have we connected yet?
            if (webSocket == null)
            {
                Uri myUri = new Uri("wss://192.168.0.135:51200");
                webSocket = new MessageWebSocket();
                webSocket.Control.MessageType = SocketMessageType.Binary;
                webSocket.MessageReceived += MessageReceived;
                webSocket.Closed += Closed;
                webSocket.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
                webSocket.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName);

                await webSocket.ConnectAsync(myUri); // Times out here, Output=WinRT information: The operation timed out
                messageWebSocket = webSocket;
                messageWriter = new DataWriter(webSocket.OutputStream);
            }

            messageWriter.WriteBytes(new byte[] {0, 1});
            await messageWriter.StoreAsync();
        }
        catch (Exception ex)
        {
            String.Format("There is an error in connection");
        }
        return true;
    }


    //Sends the data
    private static void MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
    {
        try
        {
            using (DataReader reader = args.GetDataReader())
            {
                //reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                //string read = reader.ReadString(reader.UnconsumedBufferLength);
                //var read = reader.ReadBytes();// .ReadString(reader.UnconsumedBufferLength);
                var read = reader.ReadByte();
            }
        }
        catch (Exception ex)
        {
            String.Format("There is an error sending the data");
        }
    }


    // Close connection
    private static void Closed(IWebSocket sender, WebSocketClosedEventArgs args)
    {
        MessageWebSocket webSocket = Interlocked.Exchange(ref messageWebSocket, null);
        if (webSocket != null)
        {
            webSocket.Dispose();
        }
    }

У меня есть пример скрипта на Python, который работает без проблем, я просто хочу сделать то же самое в c #

Часть скрипта Python выглядит так:

def main():
sock = socket.socket(socket.AF_INET)
sock.settimeout(10.0)

context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.check_hostname = False
#accept self-signed certificate
context.verify_mode = ssl.CERT_NONE

conn = context.wrap_socket(sock, server_hostname=KLF200_ADDRESS)

try:
    conn.connect((KLF200_ADDRESS, PORT))
    process_connection(conn)
except BaseException as e:
    raise(e)
finally:
    conn.close()

main()
...