SSL/TLS Support

支持安全套接字层/传输层安全。在使用 NIO 时,JDK 5+ SSLEngine 功能用于在建立连接后处理握手。在不使用 NIO 时,标准 SSLSocketFactorySSLServerSocketFactory 对象用于创建连接。提供了一些策略接口来允许进行大量的自定义。这些接口的默认实现提供了开始使用安全通信的最简单方法。

Getting Started

无论是否使用 NIO,都需要在连接工厂上配置 ssl-context-support 属性。此属性引用描述必需密钥库的位置和密码的 <bean/> 定义。

SSL/TLS 对等方各需要两个密钥库:

  • 一个密钥库,用于包含用于识别对等者的私钥和公钥对

  • 一个受信任存储库,用于包含受信任对等者的公钥。请参阅 JDK 提供的 `keytool`实用程序的文档。基本步骤如下:[style="arabic"]

    1. 创建一个新密钥对并将其存储在密钥库中。

    2. Export the public key.

    3. 将公钥导入对等者的信任存储库。

    4. 对其他对等者重复上述步骤。

在测试用例中,在两个对等方上使用相同的密钥库很常见,但在生产中应避免这样做。

建立密钥库后,下一步是将其位置指示给 TcpSSLContextSupport bean,并将对该 bean 的引用提供给连接工厂。

以下示例配置 SSL 连接:

<bean id="sslContextSupport"
    class="o.sf.integration.ip.tcp.connection.support.DefaultTcpSSLContextSupport">
    <constructor-arg value="client.ks"/>
    <constructor-arg value="client.truststore.ks"/>
    <constructor-arg value="secret"/>
    <constructor-arg value="secret"/>
</bean>

<ip:tcp-connection-factory id="clientFactory"
    type="client"
    host="localhost"
    port="1234"
    ssl-context-support="sslContextSupport" />

DefaultTcpSSLContextSupport 类还有一个可选的 protocol 属性,该属性可以是 SSLTLS(默认)。

密钥库文件名(前两个构造函数参数)使用 Spring Resource 抽象。默认情况下,文件位于类路径上,但是可以通过使用 file: 前缀(改而在文件系统上查找文件)来覆盖这一点。

从版本 4.3.6 开始,在使用 NIO 时,可以在连接工厂上指定 ssl-handshake-timeout(以秒为单位)。当等待数据时,此超时(默认值为 30 秒)在 SSL 握手期间使用。如果超过超时,则将停止该过程并关闭套接字。

Host Verification

从版本 5.0.8 开始,可以配置是否启用主机验证。从版本 5.1 开始,默认情况下已启用该功能;禁用它的机制取决于是否使用 NIO。

主机验证用于确保连接到的服务器与证书中的信息匹配,即使证书受信任也是如此。

例如,在使用 NIO 时,配置 DefaultTcpNioSSLConnectionSupport

@Bean
public DefaultTcpNioSSLConnectionSupport connectionSupport() {
    DefaultTcpSSLContextSupport sslContextSupport = new DefaultTcpSSLContextSupport("test.ks",
            "test.truststore.ks", "secret", "secret");
    sslContextSupport.setProtocol("SSL");
    DefaultTcpNioSSLConnectionSupport tcpNioConnectionSupport =
            new DefaultTcpNioSSLConnectionSupport(sslContextSupport, false);
    return tcpNioConnectionSupport;
}

第二个构造函数参数禁用主机验证。然后将 connectionSupport bean 注入到 NIO 连接工厂。

在不使用 NIO 的情况下,配置位于 TcpSocketSupport 中:

connectionFactory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));

同样,构造函数参数禁用主机验证。