Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java web服务客户端使用需要签名头和正文的WCF服务_Java_C#_Web Services_Wcf_Wsdl - Fatal编程技术网

Java web服务客户端使用需要签名头和正文的WCF服务

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

我们正在开发的系统包括以下应用程序: -一种.Net WCF安全令牌服务,可发出WSTrust访问令牌。 -公开简单Ping操作的Java服务。 -一个Java servlet,它调用STS获取令牌,然后使用它访问服务

.Net WCF STS的要求: -请求和响应的消息体都必须签名。 -没有加密。 -必须有时间戳并且必须签名。 -必须使用https

为了满足这些要求,我们制作了一个自定义WCF web服务,其自定义绑定为:

        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并生成带有签名的正确请求