第 6 章 消息保护
摘要
本章介绍了以下消息保护机制:防止丢弃(使用加密算法)和保护消息篡改(使用消息摘要算法)。该保护可以在不同的粒度级别和不同的协议层中应用。在传输层,您可以选择将保护应用到消息的所有内容。在 SOAP 层,您可以选择将保护应用到消息的不同部分(正文、标头或附件)。
6.1. 传输层安全性
概述
传输层安全性保护指的是由传输层提供的消息保护(静态和签名)。例如,HTTPS 使用 SSL/TLS 提供加密和消息签名功能。实际上,WS-SecurityPolicy 不适用于 HTTPS 功能集,因为 HTTPS 已经使用 Blueprint XML 配置完全可配置(请参阅 第 3 章 配置 HTTPS)。为 HTTPS 指定传输绑定策略的一个优点是,它可让您在 WSDL 合同中嵌入安全要求。因此,获取 WSDL 合同副本的任何客户端都可以发现作为 WSDL 合同中的端点的传输层安全要求。
如果您在传输层中启用 SSL/TLS 安全性,您必须确保显式禁用 SSLv3 协议,以便防止出现 Poodle 漏洞(CVE-2014-3566)。如需了解更多详细信息,请参阅 JBoss Fuse 6.x 和 JBoss A-MQ 6.x 中的禁用 SSLv3。
先决条件
如果使用 WS-SecurityPolicy 配置 HTTPS 传输,还必须在 Blueprint 配置中相应地配置 HTTPS 安全性。
例 6.1 “蓝图中的客户端 HTTPS 配置” 展示如何配置客户端以使用 HTTPS 传输协议。sec:keyManagers 元素指定客户端自己的证书 alice.pfx 以及 sec:trustManagers 元素指定可信 CA 列表。注意 http:conduit 元素的 name 属性如何使用通配符来匹配端点地址。有关如何在客户端配置 HTTPS 的详情,请参考 第 3 章 配置 HTTPS。
例 6.1. 蓝图中的客户端 HTTPS 配置
<beans xmlns="https://osgi.org/xmlns/blueprint/v1.0.0/"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:sec="http://cxf.apache.org/configuration/security" ... >
<http:conduit name="https://.*/UserNameOverTransport.*">
<http:tlsClientParameters disableCNCheck="true">
<sec:keyManagers keyPassword="password">
<sec:keyStore type="pkcs12" password="password" resource="certs/alice.pfx"/>
</sec:keyManagers>
<sec:trustManagers>
<sec:keyStore type="pkcs12" password="password" resource="certs/bob.pfx"/>
</sec:trustManagers>
</http:tlsClientParameters>
</http:conduit>
...
</beans>
例 6.2 “蓝图中的服务器 HTTPS 配置” 展示如何将服务器配置为使用 HTTPS 传输协议。sec:keyManagers 元素指定服务器自己的证书,bob.pfx 和 sec:trustManagers 元素指定可信 CA 列表。有关如何在服务器端配置 HTTPS 的详情,请参考 第 3 章 配置 HTTPS。
例 6.2. 蓝图中的服务器 HTTPS 配置
<beans xmlns="https://osgi.org/xmlns/blueprint/v1.0.0/"
xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
xmlns:sec="http://cxf.apache.org/configuration/security" ... >
<httpj:engine-factory id="tls-settings">
<httpj:engine port="9001">
<httpj:tlsServerParameters secureSocketProtocol="TLSv1">
<sec:keyManagers keyPassword="password">
<sec:keyStore type="pkcs12" password="password" resource="certs/bob.pfx"/>
</sec:keyManagers>
<sec:trustManagers>
<sec:keyStore type="pkcs12" password="password" resource="certs/alice.pfx"/>
</sec:trustManagers>
</httpj:tlsServerParameters>
</httpj:engine>
</httpj:engine-factory>
...
</beans>
您必须将 secureSocketProtocol 设置为服务器端的 TLSv1,以便防止 Poodle 漏洞(CVE-2014-3566)
策略主题
传输绑定策略必须应用到端点策略主体(请参阅 “端点策略主题”一节)。例如,如果带有 ID 的传输绑定策略, UserNameOverTransport_IPingService_policy,您可以将策略应用到端点绑定中,如下所示:
<wsdl:binding name="UserNameOverTransport_IPingService" type="i0:IPingService"> <wsp:PolicyReference URI="#UserNameOverTransport_IPingService_policy"/> ... </wsdl:binding>
语法
TransportBinding 元素具有以下语法:
<sp:TransportBinding xmlns:sp="..." ... >
<wsp:Policy xmlns:wsp="...">
<sp:TransportToken ... >
<wsp:Policy> ... </wsp:Policy>
...
</sp:TransportToken>
<sp:AlgorithmSuite ... > ... </sp:AlgorithmSuite>
<sp:Layout ... > ... </sp:Layout> ?
<sp:IncludeTimestamp ... /> ?
...
</wsp:Policy>
...
</sp:TransportBinding>策略示例
例 6.3 “传输绑定示例” 显示需要使用 HTTPS 传输(由 sp:HttpsToken 元素指定)和 256 位算法套件(由 sp:Basic256 元素指定)的传输绑定示例。
例 6.3. 传输绑定示例
<wsp:Policy wsu:Id="UserNameOverTransport_IPingService_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Lax/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
</wsp:Policy>
</sp:TransportBinding>
...
<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:TransportToken
此元素具有两倍的效果:它要求特定类型的安全令牌,并指示传输如何保护。例如,通过指定 sp:HttpsToken,这表示连接由 HTTPS 协议保护,安全令牌是 X.509 证书。
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:MustSupportRefKeyIdentifier
此元素指定,安全运行时必须能够处理 密钥标识符 令牌引用,具体如 WS-Security 1.0 规格中指定。键标识符是识别密钥令牌的机制,可以在签名或加密元素中使用。Apache CXF 需要此功能。
sp:MustSupportRefIssuerSerial
此元素指定,安全运行时必须能够处理 Issuer 和 Serial Number 令牌引用,如 WS-Security 1.0 规格中指定。签发者和序列号是识别密钥令牌的机制,可以在签名或加密元素中使用。Apache CXF 需要此功能。