【问题标题】:Transport security between Metro service and WCF clientMetro 服务和 WCF 客户端之间的传输安全性
【发布时间】:2011-05-05 10:21:44
【问题描述】:

更新

我有一个使用Transport Security (SSL) 机制保护的 Metro 2.1.1 WebService。我想使用 .NET 3.5+ WCF 客户端访问此服务。我找到了this link,它解决了同样的问题,但是我仍然无法创建一个有效的客户端。我想我在客户端配置中混淆了一些东西。

【问题讨论】:

  • 这意味着 Metro 服务的 WSDL 包含一些无法通过可用绑定配置的安全组合。所需的安全配置可能在配置注释中可见,但如果有一些特殊要求,请将您的 WSDL 中的整个安全断言发布到您的问题,以便我们可以尝试找到您需要的绑定配置。
  • @Ladislav Mrnka 感谢您的回复!我在问题中添加了 WSDL。
  • Metro 服务抛出 FaultException。 Metro 服务在 WCF ClientBase 类创建的soap 消息中寻找特定的标头。如果您有权访问调用此 Metro 服务的工作客户端,则可以使用诸如 Charles 或 Fiddler 之类的工具(侦听 SSL 流量有点棘手,但可以做到)来捕获工作客户端发送的肥皂消息,然后将其与 WCF 生成的肥皂进行比较。
  • @Sixto Saez 我做了一个 Java 客户端,可以成功调用上述 web 服务。我试图捕获 HTTPS 流量,但 web 服务调用只是在后台发生,因此 Fiddler 中没有显示任何内容。如果我打开一个受 HTTPS 保护的页面,我只能捕获 HTTPS。
  • 下面的链接可能有助于设置 Fiddler。如果这不起作用,您可以尝试查看商业 Charles 产品。另一个想法,java客户端和服务是否有一个配置选项来记录发送和接收的soap消息?这可能比尝试 Fiddler 更容易。链接:fiddlertool.com/fiddler/help/httpsdecryption.asp

标签: java .net wcf web-services ssl


【解决方案1】:

WCF 团队在this link. 发布了一组互操作性绑定,blog post 提供了有关如何使用它们的详细信息。受支持的绑定之一专门用于基于 Metro 的服务。尚未尝试设置此绑定,但似乎已涵盖此场景。

【讨论】:

  • 我还没有测试它,但我看到的主要问题是它总是显示为:“如何创建可互操作的服务”。但更常见的是如何从 XXX 服务创建客户端。
  • 同意,在服务需求中似乎总是有一些怪癖,可以通过消息合同塑造或行为等来解决,但实施修复的学习曲线非常艰巨。我希望这些新绑定可以更轻松地解决更简单的场景,而无需过度定制。感谢您在这里的 WCF 贡献,它们已经有用了一两次了 :)
  • @Sixto Saez 抱歉,到目前为止,我没有时间在这件事上取得进展,所以我会再次更新。我刚刚安装了扩展,我必须找到一种方法将证书放在本地存储中,以便向导可以看到它。
  • @Sixto Saez 我发现 WCF Express 互操作绑定在安全机制方面受到限制。
【解决方案2】:

客户端代码

//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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2010-12-25
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多