4.2. 密码套件过滤器

概述

在典型的应用程序中,您通常希望将可用密码套件的列表限制为 JSSE 供应商支持的密码的子集。

通常,您应该使用 sec:cipherSuitesFilter 元素,而不是 sec:cipherSuites 元素来选择您要使用的密码套件。

不建议使用 sec:cipherSuites 元素,因为它具有非直观语义:您可以使用它要求加载的安全供应商至少支持列出的密码套件。但是,载入的安全供应商可能会支持比指定的加密套件更多的加密套件。因此,当您使用 sec:cipherSuites 元素时,在运行时支持哪些密码套件并不明确。

命名空间

表 4.1 “用于配置 Cipher Suite 过滤器的命名空间” 显示本节中引用的 XML 命名空间:

表 4.1. 用于配置 Cipher Suite 过滤器的命名空间

sec:cipherSuitesFilter element

您可以使用 sec:cipherSuitesFilter 元素定义密码套件过滤器,可以是 http:tlsClientParameters 元素或 httpj:tlsServerParameters 元素的子级。典型的 sec:cipherSuitesFilter 元素在 例 4.1 “sec 的结构:cipherSuitesFilter Element” 中显示概要结构。

例 4.1. sec 的结构:cipherSuitesFilter Element

<sec:cipherSuitesFilter>
    <sec:include>RegularExpression</sec:include>
    <sec:include>RegularExpression</sec:include>
    ...
    <sec:exclude>RegularExpression</sec:exclude>
    <sec:exclude>RegularExpression</sec:exclude>
    ...
</sec:cipherSuitesFilter>

语义

以下语义规则适用于 sec:cipherSuitesFilter 元素:

  1. 如果 sec:cipherSuitesFilter 元素没有出现在端点配置中(即,它 没有包括在 相关 http:conduithttpj:engine-factory 元素中),则会使用以下默认过滤器:

    <sec:cipherSuitesFilter>
        <sec:include>.*_EXPORT_.*</sec:include>
        <sec:include>.*_EXPORT1024.*</sec:include>
        <sec:include>.*_DES_.*</sec:include>
        <sec:include>.*_WITH_NULL_.*</sec:include>
    </sec:cipherSuitesFilter>
  2. 如果 sec:cipherSuitesFilter 元素出现在端点的配置中,则默认 排除所有 密码套件。
  3. 要包含密码套件,请在 sec:cipherSuitesFilter 元素中添加 sec:include 子元素。sec:include 元素的内容是一个正则表达式,它与一个或多个密码套件名称匹配(例如,请参阅 “SunJSSE 支持的密码套件”一节中的密码套件名称)。
  4. 要进一步重新定义所选密码套件集合,您可以在 sec:cipherSuitesFilter 元素中添加 sec:exclude 元素。sec:exclude 元素的内容是一个正则表达式,与当前包含的集合中的零或更多密码套件名称匹配。

    注意

    有时,显式排除当前未包含的密码套件,以便根据意外包含不必要的密码套件来更好地验证。

正则表达式匹配

sec:includesec:exclude 元素中显示的正则表达式的 grammar 由 Java 正则表达式实用程序 java.util.regex.Pattern 定义。有关 grammar 的详细信息,请参阅 Java 参考指南 http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html

client conduit 示例

以下 XML 配置显示了将密码套件过滤器应用到远程端点 {WSDLPortNamespace}PortName 的客户端示例。每当客户端尝试打开到此端点的 SSL/TLS 连接时,它会将可用的密码套件限制为 sec:cipherSuitesFilter 元素选择的集合。

<beans ... >
  <http:conduit name="{WSDLPortNamespace}PortName.http-conduit">
    <http:tlsClientParameters>
      ...
      <sec:cipherSuitesFilter>
        <sec:include>.*_WITH_3DES_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:exclude>.*_WITH_NULL_.*</sec:exclude>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
      </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
  </http:conduit>

  <bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl"/>
</beans>