Странная проблема рукопожатия сертификата клиента TLS с приложением C # ASP.Net Core - PullRequest
1 голос
/ 04 апреля 2019

У меня странная проблема. Рассматриваемое приложение:

  • ASP.Net Core 2.2, работающий на .Net Framework 4.7.2
  • Запуск под управлением IIS 8.5 неуправляемым

Это приложение должно связаться со службой REST в фоновом режиме. Эта служба REST требует сертификата клиента. Я использую System.Net.Http.HttpClient для подключения к службе REST с использованием сертификата клиента по TLS 1.2.

Это работает. Однако примерно через день он просто перестает работать и возвращает

The request was aborted: Could not create SSL/TLS secure channel

Даже перезапуск приложения IIS не исправляет это. Обычно он просто начинает работать снова, и я не могу разобраться в обстоятельствах, которые приводят к этому. Перезагрузка сервера даже не обязательно исправляет это. У удаленного REST-приложения нет проблем с (многими) другими клиентскими библиотеками, разговаривающими с ним. У меня точно такая же проблема в экземплярах DEV / TRAIN и PROD одного и того же приложения. Просто чтобы быть понятным, он работает , он просто внезапно перестает работать через некоторое время, поэтому я знаю, что клиентский сертификат работает и TLS 1.2 работает. Я также использую TLS 1.2 и точно такой же сертификат клиента для одной и той же конечной точки REST в нескольких других приложениях на совершенно разных языках (PowerShell, Perl) без каких-либо проблем.

Я не могу понять, что происходит. Я попытался прочитать сертификат клиента из файловой системы перед каждым вызовом REST, а также прочитать его один раз в классе запуска и ввести его. Оба подхода имеют одну и ту же проблему.

Теперь одна вещь, в которой я подозреваю, состоит в том, что этот клиентский вызов REST не выполняет асинхронный вызов, так как это статический метод, но я не вижу, как это могло бы привести к такому результату. Если я просматриваю журналы удаленного сервера для конечной точки REST, я вижу сообщение об ошибке, что сертификат клиента не был предоставлен. Я включил отладку, чтобы записать отпечаток сертификата клиента в журналы локального приложения непосредственно перед вызовом REST, чтобы убедиться, что сертификат клиента действительно существует для вызова, и это так - журналы всегда содержат правильный отпечаток сертификата сертификата клиента в журналах. перед неудачным вызовом REST.

Обновление : я изменил вызов REST, чтобы он был асинхронным, и он не имеет значения. Сейчас я повторно использую один экземпляр HttpClient с загруженным сертификатом клиента, и все же эта ошибка начинает появляться через некоторое время.

Любые идеи высоко ценятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...