Клиент завершает SSL-соединение после того, как сервер отправляет SERVER HELLO DONE - PullRequest
0 голосов
/ 12 сентября 2018

Это мой первый вопрос о переполнении стека, я сделаю все возможное!

Я уже прочитал несколько документов о том, как работает соединение SLL / TLS. Я не нашел никакой подсказки о том, что происходит.

Я сейчас подключаюсь к серверу через SSL. Моя ОС - Windows 10. Сервер запрашивает у нас сертификат, который мы предоставляем. Там все хорошо. Соединение SSL установлено.

Теперь, когда я пытаюсь установить соединение с моего сервера, я получаю веб-исключение («Запрос был прерван: не удалось создать безопасный канал SSL / TLS».) Операционная система сервера - Windows Server 2012 R2.

Я почти уверен, что наш сервер закрывает соединение (см. Прикрепленное изображение внизу поста).

код для загрузки сертификата

        X509Certificate cubicCertificate;

        try
        {
            cubicCertificate = X509CertificateHelper.GetCertificate2FromStore(cubicCertificateThumbPrint);
        }
        catch(Exception e)
        {
            m_Log.Trace("Cubic Http client initialization - Could not load certificate");
            throw e;
        }

        var handler = new WebRequestHandler();
        handler.ClientCertificateOptions = ClientCertificateOption.Manual;
        handler.ClientCertificates.Add(cubicCertificate);
        ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

        m_HttpClient = new HttpClient(handler);

        m_HttpClient.Timeout = new TimeSpan(0, 0, 30); // 30 seconds timeout
        m_HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Код для отправки запроса

        try
        {
            var requestMessage = new HttpRequestMessage(HttpMethod.Post, $"{cubicUrl}");
            requestMessage.Content = new FormUrlEncodedContent(parameters);
            m_Log.Trace($"URL - {m_HttpClient.BaseAddress}{url}");
            Task <HttpResponseMessage> task = m_HttpClient.SendAsync(requestMessage);
            responseMessage = task.Result;
        }
        catch(Exception e)
        {
            var serializedException = JsonConvert.SerializeObject(e);
            m_Log.Trace(serializedException);

            throw e;
        }

Мы уже подтвердили

  • что сертификат, отправленный удаленным сервером, распознается нашим сервером.

  • что наш сервер может загрузить наш сертификат. (Загружается из магазина)

  • что наш сервер может получить доступ к закрытому ключу нашего сертификата

Here is an sample of the communication (WireShark)

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 13 сентября 2018

Похоже, что удаленный сервер обеспечивает проверку подлинности клиента (см. Запрос сертификата) и, возможно, он не доверяет вашему сертификату.

...