6.2. SOAP 消息保护
6.2.1. SOAP 消息保护简介
概述
通过在 SOAP 编码层而不是传输层应用消息保护,您可以访问更灵活的保护策略。特别是,因为 SOAP 层了解消息结构,您可以在更细致的粒度级别应用保护,例如,只对实际需要保护的标头进行加密和签名。此功能使您能够支持更复杂的多层架构。例如,一个纯文本标头可能位于中间层(位于安全 Iog intranet 中),而加密标头可能位于最终目的地(通过不安全的公共网络访问)。
安全绑定
如 WS-SecurityPolicy 规格中所述,可以使用以下绑定类型之一来保护 SOAP 信息:
-
SP:TransportBinding- 传输绑定 指的是在传输级别提供的消息保护(例如,通过 HTTPS)。此绑定可用于保护任何消息类型,而不只是 SOAP,在上一节中进行了详细介绍 第 6.1 节 “传输层安全性消息保护”。 -
SP:AsymmetricBinding- 非对称绑定 是指 SOAP 消息编码层提供的消息保护,其中保护功能是使用非对称加密(也称为公钥加密)实现的。 -
SP:SymmetricBinding- 对称绑定 是指 SOAP 消息编码层提供的消息保护,其中保护功能是使用对称加密的实现。对称加密示例是 WS-SecureConversation 和 Kerberos 令牌提供的令牌。
消息保护
以下保护服务质量可应用于部分或所有消息:
- 加密。
- 签名.
- signing+encryption (加密前的签名)。
- encryption+signing (签名前加密)。
这些保护的质量可在单个消息中任意组合。因此,消息的某些部分只能加密,而消息的其他部分则被签名和加密,而消息的其他部分都可以签名和加密。也可以使消息的部分保留为未受保护。
应用消息保护的最灵活的选项位于 SOAP 层(sp:AsymmetricBinding 或 sp:SymmetricBinding)。传输层(sp:TransportBinding)只为您提供 对整个 消息应用保护的选项。
指定要保护的消息部分
目前,Apache CXF 可让您签名或加密 SOAP 消息的以下部分:
-
body-sign 和/或加密 SOAP 消息中的整个
soap:BODY元素。 - header (s)-sign 和/或加密一个或多个 SOAP 消息标头。您可以单独为每个标头指定保护质量。
- attachments -sign 和/或加密 SOAP 消息中的所有附件。
- 元素- 符号和/或加密 SOAP 消息中的特定 XML 元素。
配置角色
不是消息保护所需的所有详情都使用策略指定。该策略主要用于提供指定服务所需保护质量的方法。必须使用单独的特定于产品的机制提供支持详情,如安全令牌、密码等。实际上,这意味着在 Apache CXF 中,一些支持配置详情必须在蓝图 XML 配置文件中提供。详情请查看 第 6.2.6 节 “提供加密密钥和签名密钥”。
6.2.2. 基本签名和加密场景
概述
此处描述的场景是一个客户端-服务器应用,其中设置了 非对称绑定策略 来加密和签署在客户端和服务器之间传递消息的 SOAP 正文。
示例情境
图 6.1 “基本签名和加密场景” 显示了基本签名和加密场景的概述,该场景通过将非对称绑定策略与 WSDL 合同中的端点相关联来指定。
图 6.1. 基本签名和加密场景

场景步骤
当 图 6.1 “基本签名和加密场景” 中的客户端调用接收者端点上的同步操作时,请求和回复消息将按如下方式处理:
当传出请求消息通过 WS-SecurityPolicy 处理程序时,处理程序会根据客户端非对称绑定策略中指定的策略处理消息。在本例中,处理器执行以下操作:
- 使用 bob 的公钥加密消息的 SOAP 正文。
- 使用 alice 的私钥签署加密的 SOAP 正文。
当传入的请求消息通过服务器的 WS-SecurityPolicy 处理程序时,处理程序会根据服务器非对称绑定策略中指定的策略处理消息。在本例中,处理器执行以下操作:
- 使用 alice 的公钥验证签名。
- 使用 bob 的私钥解密 SOAP 正文。
当传出回复消息通过服务器的 WS-SecurityPolicy 处理程序返回时,处理器将执行以下处理:
- 使用 alice 的公钥加密消息的 SOAP 正文。
- 使用 bob 的私钥签署加密的 SOAP 正文。
当传入的回复消息通过客户端的 WS-SecurityPolicy 处理程序返回时,处理器将执行以下处理:
- 使用 bob 的公钥验证签名。
- 使用 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
启动器令牌 引用由启动器拥有的公钥/私钥对。这个令牌如下:
- 令牌的私钥签署从启动器发送到接收方的消息。
- 令牌的公钥验证接收者接收的签名。
- 令牌的公钥加密从接收者发送到发起方的消息。
- 令牌的私钥解密启动器收到的消息。
混淆,此令牌被启动器 和 接收者同时使用。但是,只有启动器有权访问私钥,因此可以说该令牌属于发起方。在 第 6.2.2 节 “基本签名和加密场景” 中,启动器令牌是证书 alice。
此元素应包含嵌套的 wsp:Policy 元素和 sp:X509Token 元素,如下所示。sp:IncludeToken 属性设置为 AlwaysToRecipient,它指示运行时包含 alice 的公钥,每个消息发送到接收者。如果接收者希望使用启动器的证书执行身份验证,则此选项很有用。最深入的嵌套元素 WssX509V3Token10 是可选的。它指定 X.509 证书应符合哪些规格版本。您可以在此处指定以下替代方案(或 none):
- sp:WssX509V3Token10
- 此可选元素是一种策略断言,表示应使用 X509 Version 3 令牌。
- sp:WssX509Pkcs7Token10
- 此可选元素是一个策略断言,表示应使用 X509 PKCS7 令牌。
- sp:WssX509PkiPathV1Token10
- 此可选元素是一种策略断言,表示应使用 X509 PKI Path Version 1 令牌。
- sp:WssX509V1Token11
- 此可选元素是一种策略断言,表示应使用 X509 Version 1 令牌。
- sp:WssX509V3Token11
- 此可选元素是一种策略断言,表示应使用 X509 Version 3 令牌。
- sp:WssX509Pkcs7Token11
- 此可选元素是一个策略断言,表示应使用 X509 PKCS7 令牌。
- sp:WssX509PkiPathV1Token11
- 此可选元素是一种策略断言,表示应使用 X509 PKI Path Version 1 令牌。
sp:RecipientToken
接收者令牌 引用由接收者拥有的公钥/私钥对。这个令牌如下:
- 令牌的公钥加密从启动器发送到接收方的消息。
- 令牌的私钥解密接收者收到的消息。
- 令牌的私钥签署从接收者发送到发起方的消息。
- 令牌的公钥验证启动器收到的签名。
混淆,此令牌被接收者 和 发起方同时使用。但是,只有接收者有权访问私钥,因此这个令牌可以被认为属于接收者。在 第 6.2.2 节 “基本签名和加密场景” 中,接收者令牌是证书ob。
此元素应包含嵌套的 wsp:Policy 元素和 sp:X509Token 元素,如下所示。sp:IncludeToken 属性设置为 Never,因为不需要在回复消息中包含 bob 的公钥。
在 Apache CXF 中,无需在消息中发送 bob 或 alice 的令牌,因为 bob 的证书和 alice 的证书在连接结束时都提供了 - 请参阅 第 6.2.6 节 “提供加密密钥和签名密钥”。
sp:AlgorithmSuite
此元素指定用于签名和加密的加密算法套件。有关可用算法套件的详情,请参考 第 6.2.7 节 “指定算法套件”。
sp:Layout
此元素指定是否对将安全标头添加到 SOAP 消息的顺序实施任何条件。sp:Lax 元素指定不会对安全标头顺序实施任何条件。sp:Lax 的替代方案是 sp:Strict,sp:LaxTimestampFirst, 或 sp:LaxTimestampLast。
sp:IncludeTimestamp
如果策略中包含此元素,则运行时会在 wsse:Security 标头中添加 wsu:Timestamp 元素。默认情况下,不会包含 时间戳。
sp:EncryptBeforeSigning
如果消息部分同时受到加密和签名的影响,则需要指定这些操作的执行顺序。默认顺序是加密前的签名。但是,如果您在非对称策略中包含此元素,则顺序将更改为加密,然后再签名。
隐式,此元素也会影响解密和签名验证操作的顺序。例如,如果在加密前消息签名的发送者,在验证签名前,消息的接收器必须解密。
sp:EncryptSignature
这个元素指定消息签名必须加密(通过加密令牌,如 第 6.2.6 节 “提供加密密钥和签名密钥”所述)。默认值为 false。
消息签名 是通过签名消息的各种部分直接获取的签名,如消息正文、消息标头或单个元素(请参阅 第 6.2.5 节 “指定消息到加密和签名的一部分”)。有时,消息签名被称为 主签名,因为 WS-SecurityPolicy 规格也支持支持令牌(用于签署主签名)的概念。因此,如果将 sp:EndorsingSupportingTokens 元素应用到端点,您可以有一个签名链:主签名,为消息本身签名,以及为主签名签名。
有关各种支持令牌类型的详情,请参考 “SupportingTokens assertions”一节。
sp:ProtectTokens
此元素指定签名必须覆盖用于生成该签名的令牌。默认值为 false。
sp:OnlySignEntireHeadersAndBody
此元素指定签名 只能 应用到整个正文或整个标头,不适用于标头的正文或子元素的子元素。当启用这个选项时,您可以有效地阻止使用 sp:SignedElements assertion (请参阅 第 6.2.5 节 “指定消息到加密和签名的一部分”)。
6.2.4. 指定 SymmetricBinding 策略
概述
对称绑定策略使用对称密钥算法(共享密钥密钥)实施 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 节 “指定算法套件”。
sp:Layout
此元素指定是否对将安全标头添加到 SOAP 消息的顺序实施任何条件。sp:Lax 元素指定不会对安全标头顺序实施任何条件。sp:Lax 的替代方案是 sp:Strict,sp:LaxTimestampFirst, 或 sp:LaxTimestampLast。
sp:IncludeTimestamp
如果策略中包含此元素,则运行时会在 wsse:Security 标头中添加 wsu:Timestamp 元素。默认情况下,不会包含 时间戳。
sp:EncryptBeforeSigning
当消息部分同时受到加密和签名时,必须指定执行这些操作的顺序。默认顺序是加密前的签名。但是,如果您在对称策略中包含此元素,则顺序将更改为加密,然后再签名。
隐式,此元素也会影响解密和签名验证操作的顺序。例如,如果在加密前消息签名的发送者,在验证签名前,消息的接收器必须解密。
sp:EncryptSignature
此元素指定消息签名必须加密。默认值为 false。
sp:ProtectTokens
此元素指定签名必须覆盖用于生成该签名的令牌。默认值为 false。
sp:OnlySignEntireHeadersAndBody
此元素指定签名 只能 应用到整个正文或整个标头,不适用于标头的正文或子元素的子元素。当启用这个选项时,您可以有效地阻止使用 sp:SignedElements assertion (请参阅 第 6.2.5 节 “指定消息到加密和签名的一部分”)。
6.2.5. 指定消息到加密和签名的一部分
概述
加密和签名提供两种保护类型:机密性和完整性。WS-SecurityPolicy 保护断言用于指定消息中 哪些 部分受到保护。另一方面,保护机制的详情在相关绑定策略中单独指定(请参阅 x第 6.2.3 节 “指定 AsymmetricBinding 策略”、第 6.2.4 节 “指定 SymmetricBinding 策略” 和 第 6.1 节 “传输层安全性消息保护”)。
此处描述的保护断言实际上设计为与 SOAP 安全性结合使用,因为它们适用于 SOAP 消息的功能。然而,这些策略也可以被传输绑定(如 HTTPS)满足,后者 对整个 消息应用保护,而不是特定部分。
策略主题
保护断言必须应用到 消息策略主题 (请参阅 “消息策略主题”一节)。换句话说,它必须放在 WSDL 绑定中的 wsdl:input、wsdl:output 或 wsdl:fault 元素中。例如,给定 ID 的保护策略,Mu tualCertificate10SignEncrypt_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
此元素指定保护应用于由标头的本地名称、使用 Name 属性和 namespace 指定的 SOAP 标头,使用 Namespace 属性。保护应用于 整个 消息标头,包括其属性及其内容。
sp:Attachments
此元素指定所有带有附件(SwA)附件的 SOAP 都受到保护。
6.2.6. 提供加密密钥和签名密钥
概述
标准 WS-SecurityPolicy 策略旨在在一些详细信息中指定 安全要求 :例如,安全协议、安全算法、令牌类型、身份验证要求等。但是,标准策略断言不提供指定关联的安全数据的任何机制,如密钥和凭证。WS-SecurityPolicy 期望通过专有机制提供必要的安全数据。在 Apache CXF 中,相关的安全数据通过 Blueprint XML 配置提供。
配置加密密钥和签名密钥
您可以通过在客户端的请求上下文或端点上下文中设置属性来指定应用程序的加密密钥和签名密钥(请参阅 “在 Blueprint 配置中添加加密和签名属性”一节)。您可以设置的属性显示在 表 6.1 “加密和签名属性” 中。
表 6.1. 加密和签名属性
| 属性 | 描述 |
|---|---|
|
|
WSS4J 属性文件/对象,其中包含用于配置签名密钥存储的 WSS4J 属性(也用于解密)和 |
|
| (可选) 签名密钥存储中要使用的密钥的用户名或别名。如果没有指定,则使用属性文件中设置的别名。如果尚未设置,并且密钥存储仅包含一个密钥,则将使用该密钥。 |
|
|
WSS4J 属性文件/对象,其中包含用于配置加密密钥存储的 WSS4J 属性(也用于验证签名)和 |
|
| (可选) 要使用的加密密钥存储中的密钥的用户名或别名。如果没有指定,则使用属性文件中设置的别名。如果尚未设置,并且密钥存储仅包含一个密钥,则将使用该密钥。 |
以上属性的名称不会被充分选择,因为它们无法准确反映它们的用途。由 security.signature.properties 指定的密钥实际上用于签名 和 解密。由 security.encryption.properties 指定的密钥实际上被用来加密和验证签名。
在 Blueprint 配置中添加加密和签名属性
在 Apache CXF 应用程序中使用任何 WS-Policy 策略前,您必须将策略功能添加到默认的 CXF 总线中。在 CXF 总线中添加 p:policies 元素,如以下 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 节 “基本签名和加密场景” 以获得更详细的说明。
以下示例演示了如何向 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>每个密钥都用于服务器端的两个不同目的:
ob.properties(即,由security.signature.properties指定的密钥)用于服务器端,如下所示:- 用于签名传出消息。
- 用于解密传入的消息。
alice.properties(即security.encryption.properties指定的密钥)在服务器端使用,如下所示:- 用于加密传出消息。
- 在传入消息上验证签名。
定义 WSS4J 属性文件
Apache CXF 使用 WSS4J 属性文件来加载加密和签名所需的公钥和私钥。表 6.2 “WSS4J 密钥存储属性” 描述您可以在这些文件中设置的属性。
表 6.2. WSS4J 密钥存储属性
| 属性 | 描述 |
|---|---|
|
|
指定
这个表中的其余属性特定于 |
|
|
(可选) 要使用的 JSSE 密钥存储供应商的名称。默认密钥存储提供程序是 Bouncy Castle。您可以通过将此属性设置为 |
|
|
Bouncy Castle 密钥存储供应商支持以下密钥存储类型:JKS 和 |
|
| 指定要加载的密钥存储文件的位置,其中指定相对于 Classpath 的位置。 |
|
|
(可选) 如果密钥存储类型是 |
|
| 此属性指定的密码用于两个目的: 解锁密钥存储(keystore 密码)并解密存储在密钥存储中的私钥(私钥密码)。因此,密钥存储密码必须与私钥密码相同。 |
例如,etc/alice.properties 文件包含用于加载 PKCScriu 文件 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 文件包含用于加载 PKCSFILTER 文件 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 对象的属性
| 属性 | 描述 |
|---|---|
|
|
指定 |
|
|
指定 |
WSS4J Crypto 接口
例 6.7 “WSS4J Crypto Interface” 如果要通过编程提供加密密钥和签名密钥,显示您可以实现的 Crypto 接口的定义。如需更多信息,请参阅 WSS4J 主页。
例 6.7. WSS4J Crypto Interface
// 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. 指定算法套件
概述
算法套件是执行操作(如签名、加密、生成消息摘要等)的加密算法的一致性集合。
为了便于参考,本节描述了 WS-SecurityPolicy 规格定义的算法套件。但是,是否一个特定的算法套件可用,但取决于底层的安全供应商。Apache CXF 安全性基于可插拔 Java Cryptography 扩展(JCE)和 Java 安全套接字扩展(JSSE)层。默认情况下,Apache CXF 配置有 Sun 的 JSSE 供应商,它支持 Sun 的 JSSE 附录 A 附录 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] 是加密密钥算法;\[Sig KD] 是签名密钥派生算法。
表 6.4. 算法套件
| 算法套件 | \[dig] | \[Enc] | \[Sym KW] | \[Asym KW] | \[Enc KD] | \[Sig KD] |
|---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
加密算法的类型
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 支持两种替代摘要算法: Sha1 和 Sha256。
Sha1 算法由以下 URI 标识:
http://www.w3.org/2000/09/xmldsig#sha1
Sha256 算法由以下 URI 标识:
http://www.w3.org/2001/04/xmlenc#sha256
加密
加密属性 [Enc] 指定用于加密数据的算法。WS-SecurityPolicy 支持以下加密算法: Aes256,Aes192,Aes128,TripleDes.
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
对称密钥换行
symmetric key wrap 属性 [Sym KW] 指定用于签名和加密对称密钥的算法。WS-SecurityPolicy 支持以下对称密钥嵌套算法: KwAes256,KwAes192,KwAes128,KwTripleDes.
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
非对称键 wrap
非对称密钥嵌套属性 [Asym KW] 指定用于签名和加密非对称密钥的算法。WS-SecurityPolicy 支持以下非对称密钥嵌套算法: KwRsaOaep,KwRsa15。
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] 指定用于计算派生密钥的算法。当安全方与共享 secret 密钥的帮助(例如,使用 WS-SecureConversation)通信时,建议使用派生的密钥而不是原始共享密钥,以避免公开太多数据以供恶意第三方进行分析。WS-SecurityPolicy 指定 PSha1 算法始终被使用。
PSha1 算法由以下 URI 标识:
http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1
加密密钥派生
加密密钥 derivation 属性 [Enc KD] 指定用于计算派生加密密钥的算法。WS-SecurityPolicy 支持以下加密密钥派生算法: PSha1L256、PSha1L192、PSha1L128.
PSha1 算法由以下 URI 标识(相同的算法用于 PSha1L256、PSha1L192 和 PSha1L128 ;只有密钥长度不同):
http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/dk/p_sha1
签名密钥派生
签名密钥派生属性 [Sig KD] 指定用于计算派生签名密钥的算法。WS-SecurityPolicy 支持以下签名密钥派生算法: PSha1L192,PSha1L128.
密钥长度属性
表 6.5 “密钥长度属性” 显示 WS-SecurityPolicy 中支持的最小和最大密钥长度。
表 6.5. 密钥长度属性
| 属性 | 密钥长度 |
|---|---|
| 最小对称密钥长度 [Min SKL] | 128, 192, 256 |
| 最大对称密钥长度 [Max SKL] | 256 |
| 最小非对称密钥长度 [Min AKL] | 1024 |
| 最大非对称密钥长度 [Max AKL] | 4096 |
最小对称密钥长度 [Min SKL] 的值取决于所选的算法套件。