Здравствуйте.
Пишу клиента для СМЭВ. Код нашел на просторах инета:
https://github.com/aanufriyev/SmevWCFServiceВылетает очень странная ошибка, суть которой я не могу понять.
Для теста использовал ДВА сертификата: сделал самоподписанный сертификат (через КриптоАрм - через меню). И также взял один старый (годом ранее использовал его в другом проекте) РАБОЧИЙ сертификат. Оба в формате *.cer
Используется КриптоПРО CSP 3.9 Триальный режим. (
ENG версия !)
System.ArgumentException was unhandled by user code
HResult=-2147024809
Message=Коллекция шифрования маркера не поддерживает алгоритм "urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001". Source=System.IdentityModel
StackTrace:
в System.IdentityModel.SecurityUtils.EncryptKey(SecurityToken wrappingToken, String encryptionMethod, Byte[] keyToWrap)
в System.ServiceModel.Security.Tokens.WrappedKeySecurityToken..ctor(String id, Byte[] keyToWrap, String wrappingAlgorithm, XmlDictionaryString wrappingAlgorithmDictionaryString, SecurityToken wrappingToken, SecurityKeyIdentifier wrappingTokenReference, Byte[] wrappedKey, SecurityKey wrappingSecurityKey)
в CryptoPro.Sharpei.ServiceModel.CPWrappedKeySecurityToken.Detour..ctor(String id, Byte[] keyToWrap, String wrappingAlgorithm, XmlDictionaryString wrappingAlgorithmDictionaryString, SecurityToken wrappingToken, SecurityKeyIdentifier wrappingTokenReference, Byte[] wrappedKey, SecurityKey wrappingSecurityKey)
в System.ServiceModel.Security.Tokens.WrappedKeySecurityToken..ctor(String id, Byte[] keyToWrap, String wrappingAlgorithm, XmlDictionaryString wrappingAlgorithmDictionaryString, SecurityToken wrappingToken, SecurityKeyIdentifier wrappingTokenReference)
в System.ServiceModel.Security.SendSecurityHeader.StartEncryption()
в CryptoPro.Sharpei.ServiceModel.CPSendSecurityHeader.StartEncryption()
в System.ServiceModel.Security.SendSecurityHeader.StartSecurityApplication()
в System.ServiceModel.Security.SecurityAppliedMessage.OnWriteMessage(XmlDictionaryWriter writer)
в System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Message message, BufferManager bufferManager, Int32 initialOffset, Int32 maxSizeQuota)
в System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage(Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset)
в Binding.SMEVTextMessageEncoder.WriteMessage(Message message, Int32 maxMessageSize, BufferManager bufferManager, Int32 messageOffset) в c:\TestProj\SmevWCFService-master\Binding\SMEVTextMessageEncoder.cs:строка 82
в System.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage(Message message, Boolean shouldRecycleBuffer)
в System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
в System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
в System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
в System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
InnerException: Null
Вот код, который приводит к этой проблеме:
(я просто исправил файл
https://github.com/aanuf...aster/Client/Program.cs) X509Certificate2 clientCert = new X509Certificate2();
clientCert.Import(@"C:\MyCert\cert.crt");
X509Certificate2 serviceCert = new X509Certificate2();
serviceCert.Import(@"C:\MyCert\cert.crt");
// далее ничего не менял
var serverName = serviceCert.GetNameInfo(X509NameType.SimpleName, false);
if (serverName != null)
{
var endpointAddr = new EndpointAddress(new Uri("http://localhost:1622/Service1.svc"),
EndpointIdentity.CreateDnsIdentity(
serverName));
client.Endpoint.Address = endpointAddr;
}
Ошибка вылетает в этом файле:
https://github.com/aanuf...MEVTextMessageEncoder.cs public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
{
var array = innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset).Array; << Вот тут и вылетело исключение Подскажите пожалуйста, что за ошибка ?
Она написана на русском, хотя КриптоПро стоит английский - поэтому полагаю, эта ошибка вызвана системной библиотекой NET. Но никак не могу нагуглить, что она означает !
Сертификаты я, вроде бы, передал корректные - по крайней мере один из них вот уже почти год используется в другом проекте в продакшене. Тем более ошибка одна и та же, для обоих сертификатов.
Спасибо !