У меня странная проблема. Рассматриваемое приложение:
- 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
с загруженным сертификатом клиента, и все же эта ошибка начинает появляться через некоторое время.
Любые идеи высоко ценятся.