Java web服务客户端使用需要签名头和正文的WCF服务
我们正在开发的系统包括以下应用程序: -一种.Net WCF安全令牌服务,可发出WSTrust访问令牌。 -公开简单Ping操作的Java服务。 -一个Java servlet,它调用STS获取令牌,然后使用它访问服务 .Net WCF STS的要求: -请求和响应的消息体都必须签名。 -没有加密。 -必须有时间戳并且必须签名。 -必须使用https 为了满足这些要求,我们制作了一个自定义WCF web服务,其自定义绑定为:Java web服务客户端使用需要签名头和正文的WCF服务,java,c#,web-services,wcf,wsdl,Java,C#,Web Services,Wcf,Wsdl,我们正在开发的系统包括以下应用程序: -一种.Net WCF安全令牌服务,可发出WSTrust访问令牌。 -公开简单Ping操作的Java服务。 -一个Java servlet,它调用STS获取令牌,然后使用它访问服务 .Net WCF STS的要求: -请求和响应的消息体都必须签名。 -没有加密。 -必须有时间戳并且必须签名。 -必须使用https 为了满足这些要求,我们制作了一个自定义WCF web服务,其自定义绑定为: var bindings = new BindingE
var bindings = new BindingElementCollection();
var transportBinding = new HttpsTransportBindingElement { RequireClientCertificate = false };
var encodingBinding = new TextMessageEncodingBindingElement() { MessageVersion = MessageVersion.Soap12WSAddressing10 };
MessageSecurityVersion version =
MessageSecurityVersion
.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
var sec = SecurityBindingElement.CreateMutualCertificateBindingElement(version) as AsymmetricSecurityBindingElement;
sec.MessageProtectionOrder = MessageProtectionOrder.EncryptBeforeSign;
bindings.Add(sec);
bindings.Add(encodingBinding);
bindings.Add(transportBinding);
服务主机的初始化如下所示:
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IWSTrust13SyncContract),
new MyCustomBinding(), "/myendpoint");
endpoint.Contract.ProtectionLevel = ProtectionLevel.Sign;
到目前为止还不错。我们用一个.Net客户端对它进行了测试,效果非常好。对于Java部分,结果不是很好。
到目前为止,我们已采取的所有步骤包括:
在Java服务中:编辑web服务属性:
使用“STS签发背书令牌”机制设置安全服务
设置密钥库和信任库
在servlet应用程序中
使用Java服务的wsdl->edit web service属性添加web服务客户端
设置安全性:密钥库和信任库
设置安全令牌服务:端点、wsdl位置、服务名称、端口名称、命名空间和ws-trust版本
使用STS的wsdl->editweb服务属性添加web服务客户端
在“服务质量”选项卡中,只有“运输”部分。安全部门不在那里。1.
设置完以上所有选项后,签入文件夹“Src/java/META-INF”,其中有wsit-client.xml和2个服务引用xml文件
我已经检查了在xml文件上生成的策略,在我看来一切正常,它的策略与我们的STS的wsdl的策略相同。具体而言,它有:
不对称绑定
签名零件
运输绑定
…
最后一步是启动服务端口并调用操作,如下所示
服务\服务=新服务\服务;
服务存根=Service.getServicePort;
返回stub.ping;
我希望在发送到STS之前,消息的头和正文都会被签名。但是,实际上,发送给STS的消息没有签名。STS抛出一个错误:
“必须对id为“_1”的安全标头元素“Timestamp”进行签名”2
如果我们更改为使用http而不是https进行传输绑定,那么发送给STS的请求消息将正确签名。但要求是使用https
我们的问题是:
1:QoS选项卡中的安全部分不正常吗?还是我们做错了什么?
2:当使用https时,如何让Java对头的主体和一些其他元素进行签名?
事实证明,该服务和Java客户端都没有问题。是暴露的WSDL造成了所有的麻烦。简单地说,WSDL同时具有AsymmetricBinding和TransportBinding元素,这使得客户机在尝试使用WSDL时感到困惑。在我从WSDL中删除TransportBinding元素之后,Java客户端可以使用WSDL并生成带有签名的正确请求