【问题标题】:Java web service client to consume a WCF service that needs header and body to be signedJava Web 服务客户端使用需要对标头和正文进行签名的 WCF 服务
【发布时间】:2015-04-04 09:16:23
【问题描述】:

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

.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 部分,结果并不是那么好。 到目前为止,我们已经完成的所有步骤是:

  1. 在Java服务中:编辑web服务属性:

    • 使用“STS Issued Endorsing token”机制设置安全服务
    • 设置 KeyStore 和 TrustStore
  2. 在 servlet 应用程序中

    • 使用 Java 服务的 wsdl 添加 Web 服务客户端 -> 编辑 Web 服务属性
    • 设置安全性:密钥库和信任库
    • 设置安全令牌服务:端点、wsdl 位置、服务名称、端口名称、命名空间和 ws 信任版本

    • 使用 STS 的 wsdl 添加 Web 服务客户端 -> 编辑 Web 服务属性

    • 在“服务质量”选项卡中,只有“传输”部分。 “安全”部分不存在。 (1)
  3. 设置完以上所有选项后,检查文件夹“Src/java/META - INF”,如预期有 wsit-client.xml 和 2 个服务引用 xml 文件

    • 我检查了在 xml 文件上生成的策略,对我来说一切正常,它与我们 STS 的 wsdl 具有相同的策略。详细来说,它有:
    • 非对称绑定
    • 签名部分
    • 传输绑定
  4. 最后一步是启动服务端口并调用如下操作 Service_Service 服务 = 新的 Service_Service(); 服务存根 = service.getServicePort(); return stub.ping();

我希望在发送到 STS 之前对邮件进行签名(包括标题和正文)。然而,实际上,发送给 STS 的消息是没有签名的。 STS 抛出错误: “必须对带有 '_1' id 的安全标头元素 'Timestamp' 进行签名”(2)

如果我们更改为使用 http 而不是 https 进行传输绑定,则对 STS 的请求消息已正确签名。但要求是使用https。

我们的问题是:

  • (1):QoS 选项卡中没有安全部分是否正常?还是我们在这里做错了什么?
  • (2):使用https时如何让Java对body和header的一些其他元素进行签名?

【问题讨论】:

    标签: java c# web-services wcf wsdl


    【解决方案1】:

    事实证明,服务和 Java 客户端都没有问题。造成所有麻烦的是暴露的 WSDL。简而言之,WSDL 具有 AsymmetricBinding 和 TransportBinding 元素,这使客户端在尝试使用 WSDL 时感到困惑。从 WSDL 中删除 TransportBinding 元素后,Java 客户端可以使用 WSDL 并生成带有签名的正确请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2014-01-24
      相关资源
      最近更新 更多