Java Metro服务和WCF客户端之间的传输安全

Java Metro服务和WCF客户端之间的传输安全,java,.net,wcf,web-services,ssl,Java,.net,Wcf,Web Services,Ssl,已更新 我有一个Metro 2.1.1 Web服务,通过机制传输安全性(SSL)进行保护。我想使用.NET 3.5+WCF客户端访问此服务。我发现它解决了同样的问题,但是我仍然无法创建一个工作客户。我想我把客户端配置中的内容弄混了。WCF团队已经发布了一组互操作性绑定,并提供了如何使用它们的详细信息。其中一个受支持的绑定专门用于基于Metro的服务。尚未尝试设置此绑定,但似乎已涵盖此场景。客户端代码: //IMPORTANT - THIS LINE IS ONLY FOR TESTING PUR

已更新


我有一个Metro 2.1.1 Web服务,通过机制
传输安全性(SSL)
进行保护。我想使用.NET 3.5+WCF客户端访问此服务。我发现它解决了同样的问题,但是我仍然无法创建一个工作客户。我想我把客户端配置中的内容弄混了。

WCF团队已经发布了一组互操作性绑定,并提供了如何使用它们的详细信息。其中一个受支持的绑定专门用于基于Metro的服务。尚未尝试设置此绑定,但似乎已涵盖此场景。

客户端代码

//IMPORTANT - THIS LINE IS ONLY FOR TESTING PURPOSES!
//This code is for accepting self-signed server certificate
ServicePointManager.ServerCertificateValidationCallback += (sender_ws, cert, chain, sslPolicyErrors) => true;

//instantiate transport binding element, leave the defaults
HttpsTransportBindingElement transport = new HttpsTransportBindingElement();

//instantiate message encoding element, where message version must be Soap11WSAddressing10 to match metro web service requirement.
TextMessageEncodingBindingElement text = new TextMessageEncodingBindingElement();
text.MessageVersion = MessageVersion.Soap11WSAddressing10;

//instantiate transport security binding element, with all the suggested values in app.config
TransportSecurityBindingElement b_element = new TransportSecurityBindingElement();
b_element.DefaultAlgorithmSuite = new Basic128SecurityAlgorithmSuite();
b_element.IncludeTimestamp = true;
b_element.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
b_element.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;
b_element.SecurityHeaderLayout = SecurityHeaderLayout.Lax;

//instantiate the custom binding and add the elements created above
CustomBinding customBinding = new CustomBinding();
customBinding.Name = "myOwnPersonalCustomBinding";
customBinding.Elements.Add(b_element);
customBinding.Elements.Add(text);
customBinding.Elements.Add(transport);

//instantiate the client

Uri uri = new Uri("https://localhost:8181/test/hello");
HelloWebServiceClient  wsClient = new HelloWebServiceClient (customBinding, new EndpointAddress(uri));
//Call
richTextBox1.Text = wsClient.hello(textBox1.Text);

这意味着来自Metro服务的WSDL包含一些无法通过可用绑定配置的安全组合。所需的安全配置可能在配置注释中可见,但只是为了满足某些特殊要求,请将WSDL中的整个安全断言发布到您的问题中,以便我们可以尝试找到您需要的绑定配置。@Ladislav Mrnka感谢您的回复!我在问题中添加了WSDL。FaultException由Metro服务引发。Metro服务正在WCF ClientBase类创建的soap消息中查找特定的头。如果您可以访问调用此Metro服务的工作客户机,则可以使用Charles或Fiddler之类的工具(监听SSL流量有点棘手,但可以做到)为了捕获工作客户端发送的soap消息,并将其与WCF生成的soap进行比较。@Sixto Saez我制作了一个Java客户端,成功地调用了上述Web服务。我试图捕获HTTPS流量,但webservice调用只发生在后台,所以在Fiddler中没有显示任何内容。我只能在打开受HTTPS保护的页面时捕获HTTPS。下面的链接可能有助于获取Fiddler设置。如果这不起作用,你可以试着看看查尔斯的商业产品。另一个想法是,java客户机和服务是否有记录发送和接收的soap消息的配置选项?这可能比尝试拉小提琴容易。Link:我还没有测试它,但我看到的主要问题是它总是以“如何创建可互操作的服务”的形式出现。但更常见的是如何为XXX服务创建客户端。同意,在服务需求中似乎总是存在一些怪癖,可以通过消息契约成形或行为等来解决,但实现修复的学习曲线相当令人畏惧。我希望这些新绑定能够更容易地解决更简单的场景,而无需过度定制。感谢您在这里的WCF贡献,它们已经有用了一两次:)@Sixto Saez抱歉,到目前为止,我没有时间在这件事上取得进展,所以我将再次更新。我刚刚安装了扩展,我必须找到一种方法将证书放入本地存储,以便向导可以看到它。@Sixto Saez我发现WCF Express互操作绑定在安全机制方面受到某种限制。