Java 开发使用安全METRO 2.1 web服务的.NET客户端

Java 开发使用安全METRO 2.1 web服务的.NET客户端,java,.net,wcf,jax-ws,java-metro-framework,Java,.net,Wcf,Jax Ws,Java Metro Framework,我有一个安全的METRO 2.1 web服务,我想开发一个可以使用它的.NET(3.5)客户端。如果WS不安全,我已经成功了,但是一旦我 安全机制是使用对称密钥的用户名身份验证,它使用开发默认值 如何在.NET中设置安全性?我一直在读地铁指南,但我只找到了断开的示例链接,指南没有让我通过。我成功地用svcuti生成了一个代理类,但我不知道如何使用它 svcutil警告: 警告1自定义工具警告:已为终结点导入安全策略。安全策略包含不能在Windows通信基础配置中表示的要求。查找有关生成的配置文件

我有一个安全的METRO 2.1 web服务,我想开发一个可以使用它的.NET(3.5)客户端。如果WS不安全,我已经成功了,但是一旦我

安全机制是使用对称密钥的
用户名身份验证
,它使用
开发默认值

如何在.NET中设置安全性?我一直在读地铁指南,但我只找到了断开的示例链接,指南没有让我通过。我成功地用
svcuti
生成了一个代理类,但我不知道如何使用它

svcutil警告:

警告1自定义工具警告:已为终结点导入安全策略。安全策略包含不能在Windows通信基础配置中表示的要求。查找有关生成的配置文件中所需的SecurityBindingElement参数的注释。使用代码创建正确的绑定元素。配置文件中的绑定配置不安全

警告2自定义工具警告:wsam:Addressing元素需要wsp:Policy子元素,但没有子元素

编辑

我想我已经非常接近解决这个问题了。我使用
keytool.exe
导出了默认的GlassFish证书:

keytool -exportcert -alias xws-security-server -storepass changeit -keystore keystore.jks -file server.cer 
keytool -printcert -file server.cer //This line shows it's content
我在客户端使用
server.cer
证书:

KDTreeWSClient wsClient = new KDTreeWSClient();
X509Certificate2 server_cert = new X509Certificate2("FullPathToCertificate/server.cer", "changeit");
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = server_cert;
wsClient.ClientCredentials.UserName.UserName = "wsitUser"; //Default GF username
wsClient.ClientCredentials.UserName.Password = "changeit"; //Default GF password
问题这会导致出现
MessageSecurityException
,因为端点的预期DNS标识为
localhost
,但端点具有
xwssecurityserver
。我可以手动将其设置为
localhost
/
xwssecurityserver

任何帮助都将不胜感激! 提前感谢,,
Daniel

我并不认为这是您的问题,但它可能有助于解决您遇到的一些工具警告问题。第二条信息看起来有点熟悉。我们有一个SOAP1.1客户机与一个Java WS对话,该Java WS暴露了自定义故障异常。当Java服务出现故障时,它将堆栈跟踪添加到故障中,我们的.NET客户端因为不支持多个子元素而崩溃,只有SOAP 1.2服务支持。在与我们的Java开发团队交谈后,他们发现Tomcat中有一个调试设置(或者在Java中,我不记得是哪个),它允许您将其关闭,因此不包括堆栈跟踪。此后,断层正确传播。抱歉,这帮不上忙,但可能会有帮助。

我并不认为这是您的问题,但它可能有助于解决您遇到的一些工具警告问题。第二条信息看起来有点熟悉。我们有一个SOAP1.1客户机与一个Java WS对话,该Java WS暴露了自定义故障异常。当Java服务出现故障时,它将堆栈跟踪添加到故障中,我们的.NET客户端因为不支持多个子元素而崩溃,只有SOAP 1.2服务支持。在与我们的Java开发团队交谈后,他们发现Tomcat中有一个调试设置(或者在Java中,我不记得是哪个),它允许您将其关闭,因此不包括堆栈跟踪。此后,断层正确传播。抱歉,我无法提供更多帮助,但它可能会有所帮助。

这是我如何配置客户端的:

Uri uri = new Uri("http://localhost:8080/JavaWSJMX/KDTreeWSService");
X509Certificate2 server_cert = new X509Certificate2("C:/../server.cer", "changeit"); //Second param is the certificate's password
AddressHeader[] ah = new AddressHeader[0];
EndpointAddress ea = new EndpointAddress(uri, EndpointIdentity.CreateX509CertificateIdentity(server_cert), ah);
KDTreeWSClient wsClient = new KDTreeWSClient("KDTreeWSPort", ea);
其中
KDTreeWSPort
endpointConfigurationName
,您可以从
.config
中获取:

<client>
  <endpoint address="http://localhost:8080/JavaWSJMX/KDTreeWSService"
    binding="customBinding" bindingConfiguration="KDTreeWSPortBinding"
    contract="KDTreeWS" name="KDTreeWSPort" />
</client>

您应该能够调用您的METRO web服务!我正在使用由svcuti生成的代理类,因此我没有进行
ServiceReference

这是我配置客户端的方式:

Uri uri = new Uri("http://localhost:8080/JavaWSJMX/KDTreeWSService");
X509Certificate2 server_cert = new X509Certificate2("C:/../server.cer", "changeit"); //Second param is the certificate's password
AddressHeader[] ah = new AddressHeader[0];
EndpointAddress ea = new EndpointAddress(uri, EndpointIdentity.CreateX509CertificateIdentity(server_cert), ah);
KDTreeWSClient wsClient = new KDTreeWSClient("KDTreeWSPort", ea);
其中
KDTreeWSPort
endpointConfigurationName
,您可以从
.config
中获取:

<client>
  <endpoint address="http://localhost:8080/JavaWSJMX/KDTreeWSService"
    binding="customBinding" bindingConfiguration="KDTreeWSPortBinding"
    contract="KDTreeWS" name="KDTreeWSPort" />
</client>

您应该能够调用您的METRO web服务!我正在使用由svcuti生成的代理类,因此我没有进行
ServiceReference

尝试在客户端应用程序的配置文件中设置DNS标识,如下所述

      <endpoint address="http://localhost:8080/SecureCalculatorApp/CalculatorWSService"
          binding="customBinding" bindingConfiguration="CalculatorWSPortBinding1"
          contract="ServiceReference3.CalculatorWS" name="CalculatorWSPort1">
        <identity>
          <dns value="{YOUR ALIAS}" />
        </identity>
      </endpoint>


作为dns值设置“xwssecurityserver”。在我的例子中,它是有效的(顺便说一句,我在解决这个问题时使用了你的问题作为基础,所以感谢你指出了正确的方法:)

尝试在客户端应用程序的配置文件中设置DNS标识,如下所述

      <endpoint address="http://localhost:8080/SecureCalculatorApp/CalculatorWSService"
          binding="customBinding" bindingConfiguration="CalculatorWSPortBinding1"
          contract="ServiceReference3.CalculatorWS" name="CalculatorWSPort1">
        <identity>
          <dns value="{YOUR ALIAS}" />
        </identity>
      </endpoint>


作为dns值设置“xwssecurityserver”。在我的例子中,它是有效的(顺便说一句,我在解决这个问题时以你的问题为基础,所以感谢你指出了正确的方向:)

这里有一个链接似乎讨论了类似的情况:这里有一个链接似乎讨论了类似的情况:谢谢!您的答案似乎更好,因为我的方法在事后导致服务器证书验证出现一些问题。谢谢!您的答案似乎更好,因为我的方法在之后的服务器证书验证中导致了一些问题。