6.2. SOAP 消息保护

6.2.1. SOAP 消息保护简介

概述

通过在 SOAP 编码层而不是传输层应用消息保护,您可以访问更为灵活的保护策略。特别是,因为 SOAP 层知道消息结构,因此您可以在更精细的粒度级别应用保护,例如仅加密并签名那些实际需要保护的标头。此功能允许您支持更复杂的多层架构。例如,一个纯文本标头可能基于中间层(位于安全内部内部),而加密标头可能基于最终目的地(通过不安全的公共网络访问)。

安全绑定

如 WS-SecurityPolicy 规格中所述,以下绑定类型之一可以用来保护 SOAP 信息:

  • SP:TransportBinding- 传输绑定 是指传输级别提供的消息保护(例如,通过 HTTPS)。此绑定可用于保护任何消息类型,而不仅仅是 SOAP,在前面的部分 第 6.1 节 “传输层安全性” 中详细介绍。
  • SP:AsymmetricBinding- 非对称绑定 是指 SOAP 消息编码层提供的消息保护,其中保护功能使用非对称加密(也称为公钥加密)实施。
  • SP:SymmetricBinding- 对称绑定 是指 SOAP 消息编码层提供的消息保护,其中保护功能将使用对称加密实施。对称加密示例是由 WS-SecureConversation 和 Kerberos 令牌提供的令牌。

消息保护

以下保护数量可应用于部分或全部消息:

  • 加密.
  • 签名.
  • 签名+encryption(在加密前签名)。
  • encryption+signing(加密,在签名前)。

这些数量保护可以是在单个消息中任意组合的保护。因此,消息的某些部分只需加密,而消息的其他部分则只签名,消息的其他部分则也可被签名和加密。也可以将消息的部分保留为不受保护。

应用消息保护的最灵活选项可在 SOAP 层提供(sp:AsymmetricBindingsp:SymmetricBinding)。传输层(sp:TransportBinding)只为您提供 对整个 消息应用保护的选项。

指定要保护的消息的部分

目前,Apache CXF 允许您为 SOAP 消息的以下部分签名或加密:

  • body-sign 和/or 加密 SOAP 消息中的 soap:BODY 元素。
  • 标头 -sign 和/或加密一个或多个 SOAP 邮件标题。您可以单独指定每个标头的保护质量。
  • Attachments-sign 和/或加密 SOAP 消息中的所有附件。
  • 元素- 在 SOAP 消息中签名和/或加密特定 XML 元素。

配置角色

不是使用策略指定消息保护所需的所有详情。这些策略主要用于指定服务所需的质量保护。必须使用一个独立的产品特定机制提供支持(如安全令牌、密码等)的详情。实际上,这意味着在 Apache CXF 中,必须在 Blueprint XML 配置文件中提供一些支持配置详细信息。详情请查看 第 6.2.6 节 “提供加密密钥和签名密钥”

6.2.2. 基本签名和加密(cenario)

概述

此处描述的场景是客户端-服务器应用程序,其中将 非对称绑定策略 设置为加密并签名在客户端和服务器之间传输的消息的 SOAP 正文。

示例情境

图 6.1 “基本签名和加密(cenario)” 演示了基本签名和加密场景的概述,具体是通过将非对称绑定策略与 WSDL 合同中的端点相关联来指定。

图 6.1. 基本签名和加密(cenario)

消息保护 01

场景步骤

图 6.1 “基本签名和加密(cenario)” 中的客户端在接收者端点上调用同步操作时,请求和回复信息会按如下方式处理:

  1. 当传出请求消息通过 WS-SecurityPolicy 处理程序时,处理程序会根据客户端的非对称绑定策略中指定的策略来处理消息。在本例中,处理程序执行以下处理:

    1. 使用 Bob 的公钥加密消息的 SOAP 正文。
    2. 使用 Alice 的私钥签署加密的 SOAP 正文。
  2. 当传入的请求消息通过服务器的 WS-SecurityPolicy 处理程序时,处理程序会根据服务器的非对称绑定策略中指定的策略来处理消息。在本例中,处理程序执行以下处理:

    1. 使用 Alice 的公钥验证签名。
    2. 使用 Bob 的私钥解密 SOAP 正文。
  3. 当传出回复消息通过服务器的 WS-SecurityPolicy 处理程序时,处理程序将执行以下处理:

    1. 使用 Alice 的公钥加密消息的 SOAP 正文。
    2. 使用 Bob 的私钥签署加密的 SOAP 正文。
  4. 当传入的回复消息通过客户端的 WS-SecurityPolicy 处理程序时,处理程序将执行以下处理:

    1. 使用 Bob 的公钥验证签名。
    2. 使用 Alice 的私钥解密 SOAP 正文。

6.2.3. 指定 AsymmetricBinding 策略

概述

非对称绑定策略使用非对称密钥算法(公钥/私钥组合)实现 SOAP 消息保护,并在 SOAP 层这样做。非对称绑定的加密和签名算法与 SSL/TLS 使用的加密和签名算法类似。然而,一个关键区别在于,SOAP 消息保护允许您选择消息的特定部分来保护(例如,单个标头、正文或附加),而传输层安全性则只能在整个消息上运行。

策略主题

非对称绑定策略必须应用到端点策略主体(请参阅 “端点策略主题”一节)。例如,如果带有 ID 的非对非对称绑定策略( MutualCertificate10SignEncrypt_IPingService_policy ),您可以按照以下方法应用策略到端点绑定中:

<wsdl:binding name="MutualCertificate10SignEncrypt_IPingService" type="i0:IPingService">
  <wsp:PolicyReference URI="#MutualCertificate10SignEncrypt_IPingService_policy"/>
  ...
</wsdl:binding>

语法

AsymmetricBinding 元素使用以下语法:

<sp:AsymmetricBinding xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
  (
   <sp:InitiatorToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:InitiatorToken>
  ) | (
   <sp:InitiatorSignatureToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:InitiatorSignatureToken>
   <sp:InitiatorEncryptionToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:InitiatorEncryptionToken>
  )
  (
   <sp:RecipientToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:RecipientToken>
  ) | (
   <sp:RecipientSignatureToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:RecipientSignatureToken>
   <sp:RecipientEncryptionToken>
     <wsp:Policy> ... </wsp:Policy>
   </sp:RecipientEncryptionToken>
  )
   <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite>
   <sp:Layout ... > ... </sp:Layout> ?
   <sp:IncludeTimestamp ... /> ?
   <sp:EncryptBeforeSigning ... /> ?
   <sp:EncryptSignature ... /> ?
   <sp:ProtectTokens ... /> ?
   <sp:OnlySignEntireHeadersAndBody ... /> ?
   ...
  </wsp:Policy>
  ...
</sp:AsymmetricBinding>

策略示例

例 6.4 “Asymmetric Binding 的示例” 演示了支持使用签名和加密的非对称绑定的示例,其中签名和加密是使用公钥/私钥对(使用非对称加密)进行的签名和加密。此示例不指定消息的哪些部分应该被签名并加密。有关如何进行此操作的详情,请参考 第 6.2.5 节 “指定到加密和签名的消息部分”

例 6.4. Asymmetric Binding 的示例

<wsp:Policy wsu:Id="MutualCertificate10SignEncrypt_IPingService_policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:AsymmetricBinding
          xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:InitiatorToken>
            <wsp:Policy>
              <sp:X509Token
                  sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                <wsp:Policy>
                  <sp:WssX509V3Token10/>
                </wsp:Policy>
              </sp:X509Token>
            </wsp:Policy>
          </sp:InitiatorToken>
          <sp:RecipientToken>
            <wsp:Policy>
              <sp:X509Token
                  sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never">
                <wsp:Policy>
                  <sp:WssX509V3Token10/>
                </wsp:Policy>
              </sp:X509Token>
            </wsp:Policy>
          </sp:RecipientToken>
          <sp:AlgorithmSuite>
            <wsp:Policy>
              <sp:Basic256/>
            </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
            <wsp:Policy>
              <sp:Lax/>
            </wsp:Policy>
          </sp:Layout>
          <sp:IncludeTimestamp/>
          <sp:EncryptSignature/>
          <sp:OnlySignEntireHeadersAndBody/>
        </wsp:Policy>
      </sp:AsymmetricBinding>
      <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:MustSupportRefKeyIdentifier/>
          <sp:MustSupportRefIssuerSerial/>
        </wsp:Policy>
      </sp:Wss10>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

sp:InitiatorToken

initiator 令牌 引用发起方拥有的公钥/私钥-对。此令牌使用如下:

  • 令牌的私钥签名信息从启动器发送到接收者。
  • 令牌的公钥验证接收方收到的签名。
  • 令牌的公钥加密从接收者发送到启动器的消息。
  • 令牌的私钥解密发起方接收的消息。

混淆,此令牌由发起方 接收者使用。但是,只有启动器有权访问私钥,因此在这种情况下,令牌可以被认为是属于发起方。在 第 6.2.2 节 “基本签名和加密(cenario)” 中,initiator 令牌是证书 Alice。

这个元素应包含嵌套的 wsp:Policy 元素和 sp:X509Token 元素,如下所示。sp:IncludeToken 属性设为 AlwaysToRecipient,它指示运行时包含 Alice 的公钥,并将每个消息发送到接收者。如果接收者希望使用启动器的证书来执行身份验证,这个选项很有用。最深嵌套的元素 WssX509V3Token10 是可选的。它指定 X.509 证书应符合哪些规格版本。此处可以指定以下替代(或 none):

sp:WssX509V3Token10
此可选元素是一个策略断言,表示应使用 X509 版本 3 令牌。
sp:WssX509Pkcs7Token10
此可选元素是一个策略断言,表示应使用 X509 PKCS7 令牌。
sp:WssX509PkiPathV1Token10
此可选元素是一个策略断言,表示应使用 X509 PKI Path Version 1 令牌。
sp:WssX509V1Token11
此可选元素是一个策略断言,表示应使用 X509 版本 1 令牌。
sp:WssX509V3Token11
此可选元素是一个策略断言,表示应使用 X509 版本 3 令牌。
sp:WssX509Pkcs7Token11
此可选元素是一个策略断言,表示应使用 X509 PKCS7 令牌。
sp:WssX509PkiPathV1Token11
此可选元素是一个策略断言,表示应使用 X509 PKI Path Version 1 令牌。

sp:RecipientToken

接收者令牌 引用由接收者拥有的公钥/私钥-对。此令牌使用如下:

  • 令牌的公钥加密从启动器发送到接收者的消息。
  • 令牌的私钥解密接收方接收的消息。
  • 令牌的私钥签名从接收者发送到发起方。
  • 令牌的公钥验证发起方接收的签名。

混淆,该令牌由接收者 启动器使用。但是,只有接收者可以访问私钥,因此使用这个意义,令牌可以被认为属于接收者。在 第 6.2.2 节 “基本签名和加密(cenario)” 中,接收者令牌是证书 Bob。

这个元素应包含嵌套的 wsp:Policy 元素和 sp:X509Token 元素,如下所示。sp:IncludeToken 属性设为 Never,因为不需要在回复消息中包含 Bob 的公钥。

注意

在 Apache CXF 中,不需要在消息中发送 Bob 或 Alice 的令牌,因为 Bob 的证书和 Alice 的证书在两端均提供,请参阅 第 6.2.6 节 “提供加密密钥和签名密钥”

sp:AlgorithmSuite

这个元素指定了用于签名和加密的加密算法套件。有关可用算法套件的详情,请参考 第 6.2.7 节 “指定 Algorithm Suite”

SP:布局

此元素指定是否在 SOAP 消息中添加安全性标头的顺序实施任何条件。sp:Lax 元素指定没有对安全标头顺序实施的条件。sp:Lax 的替代方案是 sp:Strict,sp:LaxTimestampFirst, 或 sp:LaxTimestampLast

sp:IncludeTimestamp

如果策略中包含此元素,则运行时会将 wsu:Timestamp 元素添加到 wsse:Security 标头。默认情况下 不包含 时间戳。

sp:EncryptBeforeSigning

如果消息部分同时受到加密和签名,则需要指定执行这些操作的顺序。默认顺序是在加密前签名。但是,如果您将这个元素包含在非对称策略中,则这个顺序将更改为在签名前加密。

注意

隐式,此元素也会影响解密和签名验证操作的顺序。例如,如果在加密前发送消息符号的发件人,则消息的接收器必须在验证签名前进行解密。

sp:EncryptSignature

这个元素指定必须加密消息签名(通过加密令牌,如 第 6.2.6 节 “提供加密密钥和签名密钥”所述)。默认为 false。

注意

邮件签名 是通过签署消息的各种部分直接获取的签名,如消息正文、邮件标题或独立元素(请参阅 第 6.2.5 节 “指定到加密和签名的消息部分”)。有时,消息签名被称为 主签名,因为 WS-SecurityPolicy 规格还支持端到端支持令牌的概念,该令牌用于签署主签名。因此,如果 sp:EndorsingTokens 元素应用于端点,您可以有一个签名链:主签名(签名信息本身)和辅助签名(为主签名签名签名)。

有关各种支持令牌的详情,请参考 “SupportingTokens assertions”一节

sp:ProtectTokens

此元素指定签名必须包含用于生成该签名的令牌。默认为 false。

sp:OnlySignEntireHeadersAndBody

此元素指定签名 只应用于 整个正文或整个标头,不适用于标题的正文或子元素的子元素。启用这个选项时,您可以有效地防止使用 sp:SignedElements 断言(请参阅 第 6.2.5 节 “指定到加密和签名的消息部分”)。

6.2.4. 指定 SymmetricBinding 策略

概述

对称绑定策略使用对称密钥算法(共享 secret 密钥)实现 SOAP 消息保护,并在 SOAP 层这样做。对称绑定的示例是 Kerberos 协议和 WS-SecureConversation 协议。

注意

目前,Apache CXF 只支持 对称绑定中的 WS-SecureConversation 令牌。

策略主题

对称绑定策略必须应用到端点策略主题(请参阅 “端点策略主题”一节)。例如,如果带有 ID 的对称绑定策略, SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy,您可以将策略应用到端点绑定中,如下所示:

<wsdl:binding name="SecureConversation_MutualCertificate10SignEncrypt_IPingService" type="i0:IPingService">
  <wsp:PolicyReference URI="#SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy"/>
  ...
</wsdl:binding>

语法

SymmetricBinding 元素具有以下语法:

<sp:SymmetricBinding xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
  (
   <sp:EncryptionToken ... >
     <wsp:Policy> ... </wsp:Policy>
   </sp:EncryptionToken>
   <sp:SignatureToken ... >
     <wsp:Policy> ... </wsp:Policy>
   </sp:SignatureToken>
  ) | (
   <sp:ProtectionToken ... >
     <wsp:Policy> ... </wsp:Policy>
   </sp:ProtectionToken>
  )
   <sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite>
   <sp:Layout ... > ... </sp:Layout> ?
   <sp:IncludeTimestamp ... /> ?
   <sp:EncryptBeforeSigning ... /> ?
   <sp:EncryptSignature ... /> ?
   <sp:ProtectTokens ... /> ?
   <sp:OnlySignEntireHeadersAndBody ... /> ?
   ...
  </wsp:Policy>
  ...
</sp:SymmetricBinding>

策略示例

例 6.5 “Symmetric Binding 示例” 演示了对称绑定的示例,它支持使用签名和加密的消息保护,其中签名和加密是使用单个对称密钥(即使用对称加密)进行的。此示例不指定消息的哪些部分应该被签名并加密。有关如何进行此操作的详情,请参考 第 6.2.5 节 “指定到加密和签名的消息部分”

例 6.5. Symmetric Binding 示例

<wsp:Policy wsu:Id="SecureConversation_MutualCertificate10SignEncrypt_IPingService_policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:SymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:ProtectionToken>
            <wsp:Policy>
              <sp:SecureConversationToken>
                ...
              </sp:SecureConversationToken>
            </wsp:Policy>
          </sp:ProtectionToken>
          <sp:AlgorithmSuite>
            <wsp:Policy>
              <sp:Basic256/>
            </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
            <wsp:Policy>
              <sp:Lax/>
            </wsp:Policy>
          </sp:Layout>
          <sp:IncludeTimestamp/>
          <sp:EncryptSignature/>
          <sp:OnlySignEntireHeadersAndBody/>
        </wsp:Policy>
      </sp:SymmetricBinding>
      <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:MustSupportRefKeyIdentifier/>
          <sp:MustSupportRefIssuerSerial/>
        </wsp:Policy>
      </sp:Wss10>
      ...
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>

sp:ProtectionToken

此元素指定一个对称令牌,用于签名和加密消息。例如,您可以在此处指定 WS-SecureConversation 令牌。

如果要使用不同令牌来签名和加密操作,请使用 sp:SignatureToken 元素和 sp:EncryptionToken 元素代替这个元素。

sp:SignatureToken

此元素指定一个对称令牌,用于签名消息。它应该与 sp:EncryptionToken 元素结合使用。

sp:EncryptionToken

此元素指定一个对称令牌来加密消息。它应该与 sp:SignatureToken 元素结合使用。

sp:AlgorithmSuite

这个元素指定了用于签名和加密的加密算法套件。有关可用算法套件的详情,请参考 第 6.2.7 节 “指定 Algorithm Suite”

SP:布局

此元素指定是否在 SOAP 消息中添加安全性标头的顺序实施任何条件。sp:Lax 元素指定没有对安全标头顺序实施的条件。sp:Lax 的替代方案是 sp:Strict,sp:LaxTimestampFirst, 或 sp:LaxTimestampLast

sp:IncludeTimestamp

如果策略中包含此元素,则运行时会将 wsu:Timestamp 元素添加到 wsse:Security 标头。默认情况下 不包含 时间戳。

sp:EncryptBeforeSigning

当消息部分同时受到加密和签名条件时,需要指定执行这些操作的顺序。默认顺序是在加密前签名。但是,如果您将这个元素包含在对称策略中,则这个顺序被修改为在签名前加密。

注意

隐式,此元素也会影响解密和签名验证操作的顺序。例如,如果在加密前发送消息符号的发件人,则消息的接收器必须在验证签名前进行解密。

sp:EncryptSignature

此元素指定邮件签名必须经过加密。默认为 false。

sp:ProtectTokens

此元素指定签名必须包含用于生成该签名的令牌。默认为 false。

sp:OnlySignEntireHeadersAndBody

此元素指定签名 只应用于 整个正文或整个标头,不适用于标题的正文或子元素的子元素。启用这个选项时,您可以有效地防止使用 sp:SignedElements 断言(请参阅 第 6.2.5 节 “指定到加密和签名的消息部分”)。

6.2.5. 指定到加密和签名的消息部分

概述

加密和签名提供了两种类型的保护:机密性和完整性。WS-SecurityPolicy 保护断言被用来指定消息的哪些部分受到保护。有关保护机制的详情,其他机制的详情会在相关的绑定策略中单独指定(请参阅 x第 6.2.3 节 “指定 AsymmetricBinding 策略”第 6.2.4 节 “指定 SymmetricBinding 策略”第 6.1 节 “传输层安全性”

此处描述的保护断言要与 SOAP 安全性结合使用,因为它们适用于 SOAP 消息的功能。然而,这些策略也可受到传输绑定(如 HTTPS)的要求,对整个 消息应用保护,而不是对特定部分提供支持。

策略主题

必须将一个保护断言应用到 消息策略主题 (请参阅 “消息策略主题”一节)。换句话说,它必须放在 wsdl:input 中、wsdl:outputwsdl:fault 元素 in an WSDL 绑定中。例如,如果带有 ID 的保护策略, MutualCertificate10SignEncrypt_IPingService_header_Input_policy,您可以将策略应用到 wsdl:input 消息部分,如下所示:

<wsdl:operation name="header">
  <soap:operation soapAction="http://InteropBaseAddress/interop/header" style="document"/>
  <wsdl:input name="headerRequest">
    <wsp:PolicyReference
        URI="#MutualCertificate10SignEncrypt_IPingService_header_Input_policy"/>
      <soap:header message="i0:headerRequest_Headers" part="CustomHeader" use="literal"/>
      <soap:body use="literal"/>
    </wsdl:input>
    ...
</wsdl:operation>

保护断言

Apache CXF 支持以下 WS-SecurityPolicy 保护断言:

  • SignedParts
  • EncryptedParts
  • SignedElements
  • EncryptedElements
  • ContentEncryptedElements
  • RequiredElements
  • RequiredParts

语法

SignedParts 元素使用以下语法:

<sp:SignedParts xmlns:sp="..." ... >
  <sp:Body />?
  <sp:Header Name="xs:NCName"? Namespace="xs:anyURI" ... />*
  <sp:Attachments />?
  ...
</sp:SignedParts>

EncryptedParts 元素使用以下语法:

<sp:EncryptedParts xmlns:sp="..." ... >
  <sp:Body/>?
  <sp:Header Name="xs:NCName"? Namespace="xs:anyURI" ... />*
  <sp:Attachments />?
  ...
</sp:EncryptedParts>

策略示例

例 6.6 “完整性和加密策略断言” 显示合并两个保护断言的策略:签名部分断言和加密部分断言。当此策略应用到消息部分时,受影响的消息正文会被签名并加密。另外,名为 CustomHeader 的消息标头被签名。

例 6.6. 完整性和加密策略断言

<wsp:Policy wsu:Id="MutualCertificate10SignEncrypt_IPingService_header_Input_policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <sp:Body/>
                <sp:Header Name="CustomHeader" Namespace="http://InteropBaseAddress/interop"/>
            </sp:SignedParts>
            <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <sp:Body/>
            </sp:EncryptedParts>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

sp:Body

此元素指定保护(静态或签名)应用于消息的正文。保护应用于 整个 消息正文:即 soap:Body 元素、其属性及其内容。

sp:Header

此元素指定,使用 Namespace 属性和命名空间将保护应用到标题的本地名称指定的 SOAP 标头。保护应用于 整个 邮件标头,包括其属性及其内容。

sp:Attachments

此元素指定 所有带有 Attachments(SwA)附加的 SOAP 都受到保护。

6.2.6. 提供加密密钥和签名密钥

概述

标准 WS-SecurityPolicy 策略是为了在一些详细信息中指定 安全要求 :例如,安全协议、安全算法、令牌类型、身份验证要求等等。但是,标准策略断言不提供指定相关安全数据的任何机制,如密钥和凭证。WS-SecurityPolicy 期望通过专有机制提供必要的安全数据。在 Apache CXF 中,相关的安全数据通过 Blueprint XML 配置提供。

配置加密密钥和签名密钥

您可以通过在客户端的请求上下文或端点上下文中设置属性来指定应用程序的加密密钥和签名密钥(请参阅 “为 Blueprint 配置添加加密和签名属性”一节)。您可以设置的属性显示在 表 6.1 “加密和签名属性” 中。

表 6.1. 加密和签名属性

属性描述

security.signature.properties

WSS4J 属性文件/对象,包含用于配置签名密钥存储(也用于解密)和 Crypto 对象的 WSS4J 属性属性。

security.signature.username

(可选) 要使用的签名密钥存储中密钥的用户名或别名。若不指定,则使用属性文件中设置的别名。如果也未设置,并且密钥存储仅包含一个密钥,则将使用该密钥。

security.encryption.properties

WSS4J 属性文件/对象,包含用于配置加密密钥存储(也用于验证签名)和 Crypto 对象的 WSS4J 属性属性。

security.encryption.username

(可选) 加密密钥存储中要使用的密钥的用户名或别名。若不指定,则使用属性文件中设置的别名。如果也未设置,并且密钥存储仅包含一个密钥,则将使用该密钥。

上述属性的名称不会被正确选择,因为它们无法准确反映它们的用途。由 security.signature.properties 指定的密钥实际上用于 签名和 解密。由 security.encryption.properties 指定的密钥实际上用于加密 验证签名。

为 Blueprint 配置添加加密和签名属性

在 Apache CXF 应用程序中使用任何 WS-Policy 策略前,您必须将策略功能添加到默认的 CXF 总线中。将 p:policies 元素添加到 CXF 总线,如以下 Blueprint 配置片段所示:

<beans xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:cxf="http://cxf.apache.org/core"
       xmlns:p="http://cxf.apache.org/policy" ... >

    <cxf:bus>
        <cxf:features>
            <p:policies/>
            <cxf:logging/>
        </cxf:features>
    </cxf:bus>
    ...
</beans>

以下示例演示了如何在指定服务类型的代理中添加签名和加密属性(该服务名称通过 jaxws:client 元素的 name 属性指定)。这些属性存储在 WSS4J 属性文件中,其中 alice.properties 包含签名密钥的属性,bob.properties 包含加密密钥的属性。

<beans ... >
    <jaxws:client name="{http://InteropBaseAddress/interop}MutualCertificate10SignEncrypt_IPingService"
                  createdFromAPI="true">
        <jaxws:properties>
            <entry key="ws-security.signature.properties" value="etc/alice.properties"/>
            <entry key="ws-security.encryption.properties" value="etc/bob.properties"/>
        </jaxws:properties>
    </jaxws:client>
    ...
</beans>

实际上,虽然属性名称没有明显,但每个密钥都用于客户端的两个不同的目的:

  • alice.properties (即 security.signature.properties指定的密钥)在客户端中使用,如下所示:

    • 用于签名传出消息。
    • 用于解密传入消息。
  • Bob.properties (即 security.encryption.properties)在客户端中使用,如下所示:

    • 用于加密传出消息。
    • 在传入信息中验证签名。

如果您发现这个混淆,请参阅 第 6.2.2 节 “基本签名和加密(cenario)” 以获得更详细的说明。

以下示例演示了如何在 JAX-WS 端点中添加签名和加密属性。属性文件 bob.properties 包含签名密钥和属性文件 alice.properties 的属性,包含加密密钥的属性(这是客户端配置不良)。

<beans ... >
    <jaxws:endpoint
       name="{http://InteropBaseAddress/interop}MutualCertificate10SignEncrypt_IPingService"
       id="MutualCertificate10SignEncrypt"
       address="http://localhost:9002/MutualCertificate10SignEncrypt"
       serviceName="interop:PingService10"
       endpointName="interop:MutualCertificate10SignEncrypt_IPingService"
       implementor="interop.server.MutualCertificate10SignEncrypt">

        <jaxws:properties>
            <entry key="security.signature.properties" value="etc/bob.properties"/>
            <entry key="security.encryption.properties" value="etc/alice.properties"/>
        </jaxws:properties>

    </jaxws:endpoint>
    ...
</beans>

每个密钥都用于服务器端的两个不同目的:

  • Bob.properties (即 security.signature.properties指定的密钥)在服务器端使用,如下所示:

    • 用于签名传出消息。
    • 用于解密传入消息。
  • alice.properties (即 security.encryption.properties)在服务器端使用,如下所示:

    • 用于加密传出消息。
    • 在传入信息中验证签名。

定义 WSS4J 属性文件

Apache CXF 使用 WSS4J 属性文件加载加密和签名所需的公钥和私钥。表 6.2 “WSS4J 密钥存储属性” 描述您可以在这些文件中设置的属性。

表 6.2. WSS4J 密钥存储属性

属性描述

org.apache.ws.security.crypto.provider

指定 Crypto 接口的实现(请参阅 “WSS4J Crypto 接口”一节)。通常,您可以指定 Crypto 的默认 WSS4J 实施,即org.apache.ws.security.components.crypto.Merlin

此表中的其余属性特定于 Crypto接口的 Merlin 实施

org.apache.ws.security.crypto.merlin.keystore.provider

(可选) 要使用的 JSSE 密钥存储提供程序的名称。默认密钥存储提供程序是 Bouncy Castle。您可以通过将此属性设置为 SunJSSE,将提供程序切换到 Sun 的 JSSE 密钥存储提供程序。

org.apache.ws.security.crypto.merlin.keystore.type

Bouncy Castle 密钥存储提供程序支持以下密钥存储: JKSPKCS12。此外,Boocy Castle 支持以下专有密钥存储类型:BKS 和 UBER。

org.apache.ws.security.crypto.merlin.keystore.file

指定要加载的密钥存储文件的位置,其位置相对于 Classpath。

org.apache.ws.security.crypto.merlin.keystore.alias

(可选) 如果密钥存储类型为 JKS (Java 密钥存储),您可以通过指定其别名从密钥存储中选择特定的密钥。如果密钥存储仅包含一个密钥,则不需要指定别名。

org.apache.ws.security.crypto.merlin.keystore.password

此属性指定的密码用于两个目的: 解锁密钥存储(密钥存储密码)并解密存储在密钥存储中的私钥(私钥密码)。因此,密钥存储密码必须与私钥密码相同。

例如,etc/alice.properties 文件包含用于加载 PKCS#12 文件 certs/alice.pfx 的属性设置,如下所示:

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin

org.apache.ws.security.crypto.merlin.keystore.type=PKCS12
org.apache.ws.security.crypto.merlin.keystore.password=password
org.apache.ws.security.crypto.merlin.keystore.file=certs/alice.pfx

etc/bob.properties 文件包含用于加载 PKCS#12 文件 certs/bob.pfx 的属性设置,如下所示:

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin

org.apache.ws.security.crypto.merlin.keystore.password=password

# for some reason, bouncycastle has issues with bob.pfx
org.apache.ws.security.crypto.merlin.keystore.provider=SunJSSE
org.apache.ws.security.crypto.merlin.keystore.type=PKCS12
org.apache.ws.security.crypto.merlin.keystore.file=certs/bob.pfx

编程加密密钥和签名密钥

加载加密密钥和签名密钥的替代方法是使用 表 6.3 “指定 Crypto 对象的属性” 中显示的属性来指定加载相关键的 Crypto 对象。这要求您自己提供 WSS4J Crypto 接口的实施,即 org.apache.ws.security.components.crypto.Crypto

表 6.3. 指定 Crypto 对象的属性

属性描述

security.signature.crypto

指定负责加载用于签名和解密消息的密钥的 Crypto 对象实例。

security.encryption.crypto

指定 Crypto 对象的实例,它负责加载用于加密消息和验证签名的密钥。

WSS4J Crypto 接口

例 6.7 “WSS4J Crypto 接口” 显示您可以实现的 Crypto 接口的定义(如果您想要按编程提供加密密钥和签名密钥)。如需更多信息,请参阅 WSS4J 主页

例 6.7. WSS4J Crypto 接口

// Java
package org.apache.ws.security.components.crypto;

import org.apache.ws.security.WSSecurityException;

import java.io.InputStream;
import java.math.BigInteger;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

public interface Crypto {
    X509Certificate loadCertificate(InputStream in)
    throws WSSecurityException;

    X509Certificate[] getX509Certificates(byte[] data, boolean reverse)
    throws WSSecurityException;

    byte[] getCertificateData(boolean reverse, X509Certificate[] certs)
    throws WSSecurityException;

    public PrivateKey getPrivateKey(String alias, String password)
    throws Exception;

    public X509Certificate[] getCertificates(String alias)
    throws WSSecurityException;

    public String getAliasForX509Cert(Certificate cert)
    throws WSSecurityException;

    public String getAliasForX509Cert(String issuer)
    throws WSSecurityException;

    public String getAliasForX509Cert(String issuer, BigInteger serialNumber)
    throws WSSecurityException;

    public String getAliasForX509Cert(byte[] skiBytes)
    throws WSSecurityException;

    public String getDefaultX509Alias();

    public byte[] getSKIBytesFromCert(X509Certificate cert)
    throws WSSecurityException;

    public String getAliasForX509CertThumb(byte[] thumb)
    throws WSSecurityException;

    public KeyStore getKeyStore();

    public CertificateFactory getCertificateFactory()
    throws WSSecurityException;

    public boolean validateCertPath(X509Certificate[] certs)
    throws WSSecurityException;

    public String[] getAliasesForDN(String subjectDN)
    throws WSSecurityException;
}

6.2.7. 指定 Algorithm Suite

概述

算法套件是用来执行诸如签名、加密、生成消息摘要等操作的一种一致加密算法集合。

为了参考目的,本节描述了 WS-SecurityPolicy 规范定义的算法套件。但是,是否提供特定的算法套件,这取决于底层的安全供应商。Apache CXF 安全性基于可插拔 Java Cryptography Extension(JCE)和 Java 安全套接字扩展(JSSE)层。默认情况下,Apache CXF 配置有 Sun 的 JSSE 提供者,它支持 Sun JSSE 参考指南附录 A 所述的密码套件。

语法

AlgorithmSuite 元素具有以下语法:

<sp:AlgorithmSuite xmlns:sp="..." ... >
  <wsp:Policy xmlns:wsp="...">
   (<sp:Basic256 ... /> |
    <sp:Basic192 ... /> |
    <sp:Basic128 ... /> |
    <sp:TripleDes ... /> |
    <sp:Basic256Rsa15 ... /> |
    <sp:Basic192Rsa15 ... /> |
    <sp:Basic128Rsa15 ... /> |
    <sp:TripleDesRsa15 ... /> |
    <sp:Basic256Sha256 ... /> |
    <sp:Basic192Sha256 ... /> |
    <sp:Basic128Sha256 ... /> |
    <sp:TripleDesSha256 ... /> |
    <sp:Basic256Sha256Rsa15 ... /> |
    <sp:Basic192Sha256Rsa15 ... /> |
    <sp:Basic128Sha256Rsa15 ... /> |
    <sp:TripleDesSha256Rsa15 ... /> |
    ...)
    <sp:InclusiveC14N ... /> ?
    <sp:SOAPNormalization10 ... /> ?
    <sp:STRTransform10 ... /> ?
   (<sp:XPath10 ... /> |
    <sp:XPathFilter20 ... /> |
    <sp:AbsXPath ... /> |
    ...)?
    ...
  </wsp:Policy>
  ...
</sp:AlgorithmSuite>

算法套件断言支持大量替代算法(例如 Basic256)。有关算法套件的替代方案的详情,请参考 表 6.4 “算法套件”

算法套件

表 6.4 “算法套件” 提供 WS-SecurityPolicy 支持的算法套件概述。列标题指向不同类型的加密算法,如下所示:\[Dig] 是摘要算法;\[Enc] 是加密算法;\[Sym KW] 是对称密钥包装算法;\[Asym KW] 是非对称密钥包装算法; \[Enc KD] 是加密密钥的算法;[Sym KW] 是签名算法。

表 6.4. 算法套件

算法套件\[Dig]\[Enc]\[Sym KW]\[Asym KW]\[Enc KD]\[Sig KD]

Basic256

Sha1

Aes256

KwAes256

KwRsaOaep

PSha1L256

PSha1L192

Basic192

Sha1

Aes192

KwAes192

KwRsaOaep

PSha1L192

PSha1L192

Basic128

Sha1

Aes128

KwAes128

KwRsaOaep

PSha1L128

PSha1L128

TripleDes

Sha1

TripleDes

KwTripleDes

KwRsaOaep

PSha1L192

PSha1L192

Basic256Rsa15

Sha1

Aes256

KwAes256

KwRsa15

PSha1L256

PSha1L192

Basic192Rsa15

Sha1

Aes192

KwAes192

KwRsa15

PSha1L192

PSha1L192

Basic128Rsa15

Sha1

Aes128

KwAes128

KwRsa15

PSha1L128

PSha1L128

TripleDesRsa15

Sha1

TripleDes

KwTripleDes

KwRsa15

PSha1L192

PSha1L192

Basic256Sha256

Sha256

Aes256

KwAes256

KwRsaOaep

PSha1L256

PSha1L192

Basic192Sha256

Sha256

Aes192

KwAes192

KwRsaOaep

PSha1L192

PSha1L192

Basic128Sha256

Sha256

Aes128

KwAes128

KwRsaOaep

PSha1L128

PSha1L128

TripleDesSha256

Sha256

TripleDes

KwTripleDes

KwRsaOaep

PSha1L192

PSha1L192

Basic256Sha256Rsa15

Sha256

Aes256

KwAes256

KwRsa15

PSha1L256

PSha1L192

Basic192Sha256Rsa15

Sha256

Aes192

KwAes192

KwRsa15

PSha1L192

PSha1L192

Basic128Sha256Rsa15

Sha256

Aes128

KwAes128

KwRsa15

PSha1L128

PSha1L128

TripleDesSha256Rsa15

Sha256

TripleDes

KwTripleDes

KwRsa15

PSha1L192

PSha1L192

加密算法的类型

WS-SecurityPolicy 支持以下加密算法:

对称密钥签名

对称密钥签名属性 [Sym Sig] 指定使用对称密钥生成签名的算法。WS-SecurityPolicy 指定始终使用 HmacSha1 算法。

HmacSha1 算法由以下 URI 识别:

http://www.w3.org/2000/09/xmldsig#hmac-sha1

非对称密钥签名

非对称密钥签名属性 [Asym Sig] 指定使用非对称密钥生成签名的算法。WS-SecurityPolicy 指定始终使用 RsaSha1 算法。

RsaSha1 算法由以下 URI 识别:

http://www.w3.org/2000/09/xmldsig#rsa-sha1

摘要

digest 属性 [Dig] 指定用于生成消息摘要值的算法。WS-SecurityPolicy 支持两种替代摘要算法: Sha1Sha256

Sha1 算法由以下 URI 识别:

http://www.w3.org/2000/09/xmldsig#sha1

Sha256 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#sha256

Encryption

加密属性 [Enc] 指定用于加密数据的算法。WS-SecurityPolicy 支持以下加密算法: Aes256Aes192Aes128TripleDes

Aes256 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#aes256-cbc

Aes192 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#aes192-cbc

Aes128 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#aes128-cbc

TripleDes 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#tripledes-cbc

对称密钥嵌套

对称密钥嵌套属性 [Sym KW] 指定用于签名和加密对称密钥的算法。WS-SecurityPolicy 支持以下对称密钥嵌套算法: KwAes256KwAes192KwAes128KwTripleDes

KwAes256 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#kw-aes256

KwAes192 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#kw-aes192

KwAes128 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#kw-aes128

KwTripleDes 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#tripledes-cbc

非对称密钥换行

非对称密钥换行属性 [Asym KW] 指定用于签名和加密非对称密钥的算法。WS-SecurityPolicy 支持以下非对称密钥嵌套算法: KwRsaOaepKwRsa15

KwRsaOaep 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p

KwRsa15 算法由以下 URI 识别:

http://www.w3.org/2001/04/xmlenc#rsa-1_5

computed 密钥

computed 键属性 [Comp Key] 指定用于计算派生密钥的算法。当安全方与共享密钥通信(例如,使用 WS-SecureConvers 时)时,建议使用一个派生密钥而不是原始共享密钥,以避免通过托管第三方公开大量数据以供分析。WS-SecurityPolicy 指定始终使用 PSha1 算法。

PSha1 算法由以下 URI 识别:

http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1

加密密钥分离

加密密钥 derivation 属性 [Enc KD] 指定用于计算派生加密密钥的算法。WS-SecurityPolicy 支持以下加密密钥分离算法: PSha1L256PSha1L192PSha1L128

PSha1 算法由以下 URI 识别(同一算法用于 PSha1L256PSha1L192PSha1L128 ;只有密钥长度不同):

http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1

签名密钥分离

签名密钥 derivation 属性 [Sig KD] 指定用于计算派生签名密钥的算法。WS-SecurityPolicy 支持以下签名密钥分离算法: PSha1L192PSha1L128

密钥长度属性

表 6.5 “密钥长度属性” 显示 WS-SecurityPolicy 支持的最小和最大密钥长度。

表 6.5. 密钥长度属性

属性密钥长度

最小对称密钥长度 [Min SKL]

128, 192, 256

最大对称密钥长度 [Max SKL]

256

最小非对称密钥长度 [Min AKL]

1024

最大非对称密钥长度 [Max AKL]

4096

最小对称密钥长度的值 [Min SKL] 取决于选择哪个算法套件。