Транспортная безопасность WCF / MSMQ с сертификатами - PullRequest
2 голосов
/ 27 марта 2010

моя цель - обеспечить безопасность связи между MSMQ менеджерами очередей - я не хочу, чтобы неизвестные клиенты отправляли сообщения на мой MSMQ сервер.

Я потратил много часов, пытаясь заставить Transport работать с привязкой net.msmq в WCF, где MSMQ в режиме Workgroup, а у клиента и сервера нет Active Directory… поэтому я использую сертификаты. Я создал новый X.509 сертификат с именем Kristan и поместил его в хранилище «Trusted people» на сервере и в «Моё хранилище» Current User клиента.

Я получаю ошибку:

Произошла ошибка при отправке в очередь: Unrecognized error -1072824272 (0xc00e0030).Ensure that MSMQ is installed and running. If you are sending to a local queue, ensure the queue exists with the required access mode and authorization.

Используя smartsniff, я вижу, что не было попыток соединения с удаленным MSMQ, однако, вероятно, это ошибка локального администратора очередей. Трассировка стека:

 at System.ServiceModel.Channels.MsmqOutputChannel.OnSend(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.OutputChannel.Send(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.OutputChannelBinder.Send(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

код: -

EndpointAddress endpointAddress = new EndpointAddress(new Uri(endPointAddress));

            NetMsmqBinding clientBinding = new NetMsmqBinding();
            clientBinding.Security.Mode = NetMsmqSecurityMode.Transport;

            clientBinding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.Certificate;
            clientBinding.Security.Transport.MsmqProtectionLevel = System.Net.Security.ProtectionLevel.Sign; 

            clientBinding.ExactlyOnce = false;
            clientBinding.UseActiveDirectory = false; 

            // start new
            var channelFactory = new ChannelFactory<IAsyncImportApi>(clientBinding, endpointAddress);


            channelFactory.Credentials.ClientCertificate.SetCertificate("CN=Kristan",
                StoreLocation.CurrentUser,
                StoreName.My);

Очередь помечена как «Аутентифицированная» на сервере. Я проверил эффект этого, и если я отключу все средства безопасности в клиентской отправке, то получу «Подпись недействительна» - что понятно и показывает, что он определенно ищет подпись.

Существуют ли специальные порты, которые мне нужно проверить, открыты для проверки подлинности msmq на основе сертификата?

Ответы [ 2 ]

1 голос
/ 06 апреля 2010

Посмотрите на http://www.controlsystemworks.com/articles/CertificateSecurityForWcfOverMsmq.html

Я думаю, вам нужно настроить сертификаты клиента и сервера.

0 голосов
/ 07 апреля 2010

У меня та же проблема, и я не мог понять это.Тем не менее, я получаю немного другое сообщение об ошибке 0xc00e002c, но ситуация такая же - я пытаюсь использовать Transport security с Certificate, но это просто не работает.Если я использую тот же сертификат для защиты сообщений, он работает нормально.

Кстати - если я олицетворяю процесс ASPNET, выполняемый от имени текущего пользователя (у которого больше прав), все работает как положено (без ошибок).Я также нашел файл сертификата и добавил ту же самую возможную permissions учетную запись ASPNET, но это тоже не помогает.

...