Прошу помочь в решении проблемы, возникшей при разработке сервиса для интеграции торговой площадки с сайтом Госзакупок.
Суть:
1) Разработали сервис для выгрузки информации о проводимых торгах со сторонней площадки на госзакупки. Соединение по TLS, с двухсторонней аутентификацией.
2) Сервис написан на C#, .Net Framework 4.0.
2) На машине установлена CryptoPro 3.9, в хранилище сертификатов загружен серт торговой площадки, установка соединения проходит нормально.
3) Затем отправляется xml с данными о закупке, включающими в себя закодированные в Base64 файлы с описанием закупки.
4) В случае, если приложенные к закупке файлы маленькие (менее ~7Кб), всё проходит хорошо: сервер возвращает xml с информацией о том, что всё ок.
5) А вот если файл длиной больше 7Кб, то при получении ответа от сервера падает Exception:
A call to SSPI failed, see inner exception; The message received was unexpected or badly formatted. Или, иногда,
An established connection was aborted by the software in your host machineПричину, по которой появляются разные ошибки без изменения кода, установить не удалось
6) Других отличий, за исключением Base64-строки с содержимым файла, между xml нет.
Проверял на разных машинах (Win 2008R2, Win 8.1), из разных мест. Проблема точно не в канале связи.
Сообщение отправляется и получает ответ быстро (за доли секунды), т.е. проблема не в таймауте.
Но есть пара непонятных для меня моментов:
1) При валидации сертификата сервера не находится корневой сертификат. В ValidateServerCertificate:
chain.ChainStatus==PartialChain Не удается построить цепочку сертификатов для доверенного корневого центра.
; RevocationStatusUnknown Функция отзыва не смогла произвести проверку отзыва для сертификата.
; OfflineRevocation Невозможно проверить функцию отзыва, т.к. сервер отзыва сертификатов недоступен .
2) После установки соединения в SslStream.LocalCertificate == null, хотя стрим создаётся с передачей userCertificateSelectionCallback:
Цитата:SslStream sslStream = new SslStream(
client.GetStream(),
false,
ValidateServerCertificate,
ClientCertificateSelectionCallback);
и в методе ClientCertificateSelectionCallback локальный сертификат находится и проставляется куда следует.
Было подозрение, что надо на локальную машину установить корневые сертификаты Госуслуг и УЦ, выдавшего сертификат торговой площадки.
Попробовал, но результата не принесло. Да и в таком случае не ясно, почему маленький файл уходит корректно.
P.S. Если задаю вопрос не в том разделе прошу простить и перенести в корректное место.