4.2. 密码套件过滤器

概述

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

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

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

命名空间

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

sec:cipherSuitesFilter 元素

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

例 4.1. sec:cipherSuitesFilter 元素的结构

<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:include 子元素添加到 sec:cipherSuitesFilter 元素。sec:include 元素的内容是匹配一个或多个密码套件名称的正则表达式(例如,请查看 “SunJSSE 支持的密码套件”一节中的密码套件名称)。
  4. 要进一步重新定义所选密码套件,您可以在 sec:cipherSuitesFilter 元素中添加 sec:exclude 元素。sec:exclude 元素的内容是一个正则表达式,与当前包含的集合中的零个或多个密码套件名称匹配。

    注意

    有时,明确排除当前未包含的密码套件是合理的,以便防止意外包含不需要的密码套件。

正则表达式匹配

出现在 sec:includesec:exclude 元素的正则表达式的 grammar 由 Java 正则表达式实用程序定义,java.util.regex.Pattern。有关marmar的详细描述,请参阅 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>