Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 10:45
Оценка:
Использую такую привязку
 NetTcpBinding binding = new NetTcpBinding();
 binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;


Подскажите пожалуйста как из кода указать сертификат службы и клиента? (гугл показывает только примеры с использованием XML когфига )
Re: Как в коде добавить сертификат? [WCF]
От: Sharov Россия  
Дата: 04.12.13 10:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите пожалуйста как из кода указать сертификат службы и клиента? (гугл показывает только примеры с использованием XML когфига )


http://msdn.microsoft.com/en-us/library/ms733791.aspx

смотрите код внизу.
Кодом людям нужно помогать!
Re[2]: Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 11:03
Оценка:
Здравствуйте, Sharov, Вы писали:

S>http://msdn.microsoft.com/en-us/library/ms733791.aspx

S>смотрите код внизу.

Плюс, очевидно, нужно задать сертификат на клиенте. Что-то в духе:
СhannelFactory.Credentials.ClientCertificate.SetCertificate
Re[3]: Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 11:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Sharov, Вы писали:


S>>http://msdn.microsoft.com/en-us/library/ms733791.aspx

S>>смотрите код внизу.

А>Плюс, очевидно, нужно задать сертификат на клиенте. Что-то в духе:

А>
А>СhannelFactory.Credentials.ClientCertificate.SetCertificate
А>


Спасибо огромное! SetCertificate отрабатывает на серверной и клиентской части без ошибок.
на серверную машину установил
ExampleServerCert.pfx в Personal
ExampleClientCert.cer в Trusted People

на клиентскую машину
ExampleClientCert.pfx в Personal
ExampleClientCert.cer в Trusted People

Запускаю сервер — все нормально!!!
Но клиент долго думает а потом выдает ошибку
System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication
because it is in the Faulted state.

В чем может быть ошибка???
адрес, порт проверил — все нормально. На всякий случай даже SecurityMode.None установил и данные побежали...
Re[4]: Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 11:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>на серверную машину установил

А> ExampleServerCert.pfx в Personal
А> ExampleClientCert.cer в Trusted People

А>на клиентскую машину

А> ExampleClientCert.pfx в Personal
А> ExampleClientCert.cer в Trusted People

Опечатка

на серверную машину установил
ExampleServerCert.pfx в Personal
ExampleClientCert.cer в Trusted People

на клиентскую машину
ExampleClientCert.pfx в Personal
ExampleServerCert.cer в Trusted People
Re[4]: Как в коде добавить сертификат? [WCF]
От: Sharov Россия  
Дата: 04.12.13 12:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Но клиент долго думает а потом выдает ошибку

А>System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication
А> because it is in the Faulted state.

А>В чем может быть ошибка???

для более детального описания ошибки смотрите tracelog (его надо влючить, если не включен).
Кодом людям нужно помогать!
Re[5]: Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 12:40
Оценка:
Здравствуйте, Sharov, Вы писали:


S>для более детального описания ошибки смотрите tracelog (его надо влючить, если не включен).


Попытки подключения выполнялись в течение интервала времени 00:00:01.0193447. Код ошибки TCP 10061: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение

Походу аутентификация не проходит Все свои сертификаты установил на одну машину, запускаю сервер и клиент — ошибка остается
Re[6]: Как в коде добавить сертификат? [WCF]
От: Sharov Россия  
Дата: 04.12.13 12:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Попытки подключения выполнялись в течение интервала времени 00:00:01.0193447. Код ошибки TCP 10061: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение


А>Походу аутентификация не проходит Все свои сертификаты установил на одну машину, запускаю сервер и клиент — ошибка остается


Я так понимаю -- это клиент. А сервер что пишет. У него надо смотреть.
Кодом людям нужно помогать!
Re[7]: Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 13:09
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Попытки подключения выполнялись в течение интервала времени 00:00:01.0193447. Код ошибки TCP 10061: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение


А>>Походу аутентификация не проходит Все свои сертификаты установил на одну машину, запускаю сервер и клиент — ошибка остается


S>Я так понимаю -- это клиент. А сервер что пишет. У него надо смотреть.


Сервер ничего не пишет. Никаких исключений на нем не возникает. Приведу код сервера


            NetTcpBinding binding = new NetTcpBinding( SecurityMode.Transport);
            binding.Security.Message = null;
            binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
            binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
            using (ServiceHost host = new ServiceHost(typeof(Server), new Uri("net.tcp://localhost:9877/Example")))
            {
                host.AddServiceEndpoint(typeof(IServerContract), binding, string.Empty);
                host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
                host.Credentials.ClientCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine;
                host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "ExampleServerCert");
                try { host.Open(); }
                catch (Exception e) { Console.WriteLine(e.ToString()); }
                while (Console.ReadKey(true).Key != ConsoleKey.Escape) ;
            }


Код клиента
            NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);
            binding.Security.Message = null;
            binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
            binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
            try
            {
                using (DuplexChannelFactory<IServerContract> channel = new DuplexChannelFactory<IServerContract>(new InstanceContext(new Client()), binding, new EndpointAddress("net.tcp://localhost:9877/Example")))
                {
                    channel.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
                    channel.Credentials.ServiceCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine;
                    channel.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "ExampleClientCert");
                    IServerContract contract = channel.CreateChannel();
                    contract.SendMessage("Hello world!!!", Environment.MachineName); // тут возникает выше указанное исключение
                }
            }
            catch (Exception e) { Console.WriteLine(e.ToString()); }
            while (Console.ReadKey(true).Key != ConsoleKey.Escape) ;
Re[8]: Как в коде добавить сертификат? [WCF]
От: Sharov Россия  
Дата: 04.12.13 13:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сервер ничего не пишет. Никаких исключений на нем не возникает. Приведу код сервера


Не может сервер ничего не писать. Я имел ввиду WCF'ые логи -- http://www.topwcftutorials.net/2012/06/simple-steps-to-enable-tracing-in-wcf.html.
Все это можно сделать через MS configuration editor или
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\SvcConfigEditor.exe
Кодом людям нужно помогать!
Re[9]: Как в коде добавить сертификат? [WCF]
От: Аноним  
Дата: 04.12.13 13:54
Оценка:
Здравствуйте, Sharov, Вы писали:


Нашел ошибку. оказывается когда создаешь сертификат сервера нужно указывать после CN имя компьютера

makecert -r -pe -sky exchange -n "CN=ComputerName" ExampleServerCert.cer -sv ExampleServerCert.pvk
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.