Решение проблем с WCF
Опубликовано Артем Макаров on 2020-02-27 10:57

0. Убедиться, что введены действующие лицензии на продукты КриптоПро.NET и КриптоПро.CSP. Посмотреть лицензии можно через "Управление лицензиями КриптоПро PKI"

1. Убедиться, что установлена последняя версия КриптоПро.NET. Скачать последнюю версию. В случае использования SDK убедиться, что также используется последняя версия.

2. Проверить установленную версию .NET Framework. В настоящий момент поддерживаются версии 4.0 - 4.8

3. Проверить целевую версию .NET Framework под которую собирается проект (target framework в свойствах проекта). В настоящий момент поддерживаются версии 4.0 - 4.8.

4. При использовании целевой версии старше 4.6.2 включительно .NET Framework использует CNG провайдеры по умолчанию, которые не поддерживаются КриптоПро.NET. Для корректной работы необходимо выставить switch DisableCngCertificates=true. Сделать это можно следующим образом:

В app.config файле:

<configuration>
<runtime>

<AppContextSwitchOverrides value="Switch.System.IdentityModel.DisableCngCertificates=true" />

</runtime>

</configuration>

В web.config файле:
<configuration>
<appSettings>

<add key="AppContext.SetSwitch:Switch.System.IdentityModel.DisableCngCertificates" value="true" />

</appSettings>
</configuration>

Или в коде:

private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificate";
AppContext.SetSwitch(DisableCngCertificates, true);

5. При использовании целевой версии старше 4.5 включительно, в случае использования в проекте сборок CryptoPro.Sharpei.ServiceModel.dll и CryptoPro.Sharpei.IdentityModel.dll их необходимо заменить на сборки CryptoPro.Sharpei.ServiceModel45.dll и CryptoPro.Sharpei.IdentityModel45.dll соответственно и пересобрать проект.

6. Убедиться, что для используемой привязки на сервере и клиенте используются одинаковые алгоритмы. В сертификатах сервера и клиента в поле "Открытый ключ" должен быть указан один и тот же алгоритм для сервера и клиента. Смешанные сценарии (ГОСТ 2012 256 + ГОСТ 2012 512) не поддерживаются.

7. Убедиться, что выданы права на закрытый ключ сертификата для учётной записи, от имени которой выполняются приложение. Подробнее.

8. Проверить журналы System (Система) и Application (Приложение) на наличие ошибок через eventvwr.exe.

9.

Собрать message и trace лог в момент возникновения ошибки на сервере и клиенте. Подробнее.

Пример:
<system.diagnostics>

<sources>
<source name="System.ServiceModel.MessageLogging" switchValue="All">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default">
<filter type="" />
</add>
<add name="ServiceModelMessageLoggingListener">
<filter type="" />
</add>
</listeners>
</source>
<source name="System.ServiceModel" switchValue="All" propagateActivity="true">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default">
<filter type="" />
</add>
<add name="ServiceModelTraceListener">
<filter type="" />
</add>
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="C:\logs\my_service_web_messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
<filter type="" />
</add>
<add initializeData="C:\logs\my_serice_web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
<filter type="" />
</add>
</sharedListeners>
<trace autoflush="true" />

</system.diagnostics>

10. При обращении в техподдержку приложить файл конфигурации клиента и сервера, описание используемой привязки, message и trace логи сервера и клиента, все используемые сертификаты и ошибки в журналах Windows. Указать версии .NET Framework, КриптоПро .NET, КриптоПро CSP, целевой .NET Framework. Приложить файл osinfo (Подробнее). По возможности создать тестовый пример решения, содержащего проекты клиента и сервера в вашей конфигурации, на которых воспроизводится ошибка.

(1 плюсик(ов))
Класс!
Не очень :(