Добрый день.
Реализую взаимодействие с сервисами ГАСУ средствами СМЭВ. Сервисы ГАСУ туннелируются с нашей стороны через контуры регионального СМЭВ, подключенного к федеральному контуру СМЭВ, в котором расположен сам сервис ГАСУ.
Для взаимодействия нашей системы с ГАСУ был сгенерирован WCF клиент из WSDL, находящихся по адресу ГАСУ в контуре СМЭВ.
Посмотрев примеры из КриптоПРО .Net SDK, аналогичным образом создали клиент WCF для себя.
Ниже код инициализации клиента:
Код:this.gasuClient = new gasu2Client();
if (clientCert == null || serverCert == null)
throw new ObjectNotFoundException("Не найдены сертификаты электронной подписи");
gasuClient.ClientCredentials.ClientCertificate.Certificate = clientCert;
gasuClient.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert;
gasuClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
gasuClient.ClientCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
string serverCommonName = serverCert.GetNameInfo(X509NameType.SimpleName, false);
// DNS имя не совпадает с CommonName из сертификата сервера. Поэтому явно задаем доверие.
EndpointAddress myEndpointAddr = new EndpointAddress(new Uri(GASUEndpointAddress),
EndpointIdentity.CreateDnsIdentity(
serverCommonName));
gasuClient.Endpoint.Address = myEndpointAddr;
Кодировщик СМЭВ подключается через файл конфигурации следующим образом:
Код:<bindings>
<customBinding>
<binding name="gasuBinding" openTimeout="01:00:00" closeTimeout="01:00:00" sendTimeout="01:00:00" receiveTimeout="01:00:00">
<security
defaultAlgorithmSuite="BasicGostObsolete"
allowSerializedSigningTokenOnReply="true"
allowInsecureTransport="true"
enableUnsecuredResponse="true"
authenticationMode="MutualCertificateDuplex"
includeTimestamp="false"
requireSignatureConfirmation="false"
messageProtectionOrder="SignBeforeEncrypt"
messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
<localClientSettings detectReplays="false" />
<localServiceSettings detectReplays="false" />
</security>
<SMEVTextMessageEncoder />
<httpTransport maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
Клиент отрабатывает успешно (запрос и ответ на сервис успешно ловятся сниффером), однако, при обработке ответа выбрасывается исключение:
Код:The incoming message was signed with a token which was different from what used to encrypt the body. This was not expected.
Собственно, содержимое ответа представлено тут
http://pastebin.com/q0eYLueCВ данном ответе, есть три подписи. Возникло мнение, что как раз из-за одной из них и происходит ошибка.
Так же, нашел реализацию кодировщика вот здесь:
https://github.com/aanuf...vice/tree/master/BindingПри использовании данного кодировщика, исключительных ситуаций не возникает, однако, сообщение диссериализуется не корректно, а именно, 90% тела ответа содержат null.
Подскажите, в чем может быть проблема?
P.S. В качестве сертификата serverCert используется сертификат полученный от тех поддержки СМЭВ, относящийся к сервису ГАСУ в СМЭВ.
P.S.S. Я пытался переписать кодировщик таким образом, чтобы он убирал третью подпись из ответа, однако, это ни привело ни к каким результатам. Данная мысль у меня возникла, когда клиент успешно отрабатывал с той же конфигурацией для сервисов расположенных в сети Интернет.
Заранее спасибо.