带证书的WCF / MSMQ传输安全性

时间:2010-03-27 09:40:10

标签: wcf certificate msmq

我的目标是保护MSMQ队列管理员之间的通信 - 我不希望未知客户端向我的MSMQ服务器发送消息。

我现在花了很多时间尝试Transport安全工作net.msmq绑定WCF,其中MSMQ处于Workgroup模式且客户端和服务器没有Active Directory ...所以我正在使用证书。我创建了一个名为X.509的新Kristan证书,并将其放入服务器上的“Trusted people”商店,并放入客户端的Current User我的商店。 / p>

我得到的错误是:

  

发送到队列时发生错误: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 auth?

2 个答案:

答案 0 :(得分:1)

查看http://www.controlsystemworks.com/articles/CertificateSecurityForWcfOverMsmq.html

我认为您需要设置客户端和服务器证书。

答案 1 :(得分:0)

我遇到了同样的问题而无法解决这个问题。但是,我收到的错误消息略有不同0xc00e002c但情况相同 - 尝试将Transport安全性与Certificate一起使用,但它根本不起作用。如果我使用相同的证书来保证邮件安全,那就可以了。

顺便说一下 - 如果我冒充ASPNET进程作为当前用户(具有更多权限)运行,一切都按预期工作(没有错误)。我还找到了证书文件,并将所有可能的permissions添加到ASPNET帐户,但这也无济于事。