Время ожидания MessageWebSocket ConnectAsync истекает при использовании TLS 1.2 и самозаверяющих сертификатов

Я пытаюсь отправить несколько байтов через соединение 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()

Вы путаете простые сокеты (или простые сокеты с TLS) с веб-сокетами, которые звучат похоже, но являются разными и несовместимыми вещами. Ваш клиент python использует простые (TLS) сокеты, в то время как ваш клиент C# выполняет WebSockets.

Steffen Ullrich 19.10.2018 21:09

Штеффен, это может многое объяснить. Итак, что мне тогда использовать вместо MessageWebSocket, может быть, Windows.Networking.Sockets.StreamSocketListener?

kfj 19.10.2018 21:17

У меня нет опыта работы с C#, но простой поиск C# сокет, похоже, предоставляет соответствующую информацию.

Steffen Ullrich 19.10.2018 21:35
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Обновление драйверов Microsoft ODBC (с 17 до 18) для PHP
Обновление драйверов Microsoft ODBC (с 17 до 18) для PHP
Все знают, что PHP v7.4 потерял поддержку, и наши недавние старые приложения должны обновиться до PHP v8.x. ...
0
3
312
0

Другие вопросы по теме