Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Реализация клиента веб сервиса ч-з защищ прпротол


Автор: sergushkin 22.5.2014, 17:28
Народ помогите с реализацией кода клиента веб-сервиса на C# через защищенный протокол.
В наличае есть два сертификата и два приватных ключа. 

алгоритм ключа RSA  дина 2048.

Мой код
Код

var customBinding = new CustomBinding();
            var sec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
            var userNameToken = new UserNameSecurityTokenParameters();
            sec.EnableUnsecuredResponse = true;
            sec.EndpointSupportingTokenParameters.Signed.Add(userNameToken);
            sec.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
            sec.IncludeTimestamp = true;
            sec.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
            sec.AllowInsecureTransport = true;
            customBinding.Elements.Add(sec);
            customBinding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
            customBinding.Elements.Add(new HttpsTransportBindingElement());

            string url = "<url>";
            Uri uri = new Uri(url);
            DnsEndpointIdentity identity = new DnsEndpointIdentity("<username>");
            EndpointAddress address = new EndpointAddress(uri, identity, new AddressHeaderCollection());

            string certPath1 = "D:\\2\\<cert1>.p12";
            var cert1 = new X509Certificate2(certPath1);
            string certPath2 = "D:\\2\\<cert2>.p12";
            var cert2 = new X509Certificate2(certPath2, "<password>");
            paymentService.PaymentServiceClient client = new paymentService.PaymentServiceClient(customBinding, address);
            client.ClientCredentials.UserName.UserName = "<user>";
            client.ClientCredentials.UserName.Password = "<password>";
            client.ClientCredentials.ServiceCertificate.DefaultCertificate = cert1;
            client.ClientCredentials.ClientCertificate.Certificate = cert2;
            try
            {
                client.Open();
                string s = client...;
                MessageBox.Show(s);
                client.Close();
            }
            catch (Exception ex)
            {
                textBox1.Text = ex.ToString();
                client.Close();
            }


Получаю ошибку 400. Ошибка возникает в строке string s = client...;

Может я вообще в принципе не то делаю?

Заранее спасибо.

Автор: sergushkin 28.5.2014, 09:42
Попытался реализовать эту задачу с помощью customBinding, сконфигурированного  app.config. От ошибки 400 избавился, но всё таки положительного результата не добился. Нашёл ссылку

http://www.rsdn.ru/forum/dotnet/4583891.1

Это как раз таки моя задача один в один. Понял, что на C#  это не реализуемо (попробовал все варианты шифрования + эта ссылка). В WCF нет Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"

Получается, что это надо делать на низком уровне через TCP/IP протокол? Самому кодировать сообщения?

Автор: jonie 28.5.2014, 10:26
ну уж не через TCP\IP, а уровнем повыше (HTTP(s))... если хотите... но вообще можно и встроить в WCF подписывание же (реализовать самому).

посмотрите в сторону Web Services Enhancements (старенько, но многое там может быть такое, чего нет в wcf)..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)