моя цель - обеспечить безопасность связи между 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 на основе сертификата?