SSL/TLS 支持
安全套接字层/传输层安全是受支持的。当使用 NIO 时,JDK 5+ SSLEngine 特性会在连接建立后处理握手。当不使用 NIO 时,标准的 SSLSocketFactory 和 SSLServerSocketFactory 对象会被用来创建连接。提供了一些策略接口以允许显著的自定义。这些接口的默认实现提供了最简单的方式来开始安全通信。
入门
无论是否使用 NIO,您都需要在连接工厂上配置 ssl-context-support 属性。此属性引用一个 <bean/> 定义,该定义描述了所需密钥库的位置和密码。
SSL/TLS 对等方各自需要两个密钥库:
- 
包含私钥和公钥对的密钥库,用于识别对等方 
- 
包含受信任对等方的公钥的信任库。请参阅 JDK 提供的 keytool实用程序的文档。主要步骤是- 
创建新的密钥对并将其存储在密钥库中。 
- 
导出公钥。 
- 
将公钥导入对等方的信任库。 
- 
对另一对等方重复上述步骤。 
 
- 
在测试用例中,在两个对等方上使用相同的密钥库是很常见的,但在生产环境中应避免这样做。
在建立密钥库之后,下一步是将它们的位置指示给 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 属性,可以是 SSL 或 TLS(默认值)。
密钥库文件名(前两个构造函数参数)使用 Spring Resource 抽象。默认情况下,文件位于类路径上,但你可以通过使用 file: 前缀来覆盖此设置(以在文件系统中查找文件)。
从 4.3.6 版本开始,当您使用 NIO 时,可以在连接工厂上指定一个 ssl-handshake-timeout(以秒为单位)。此超时时间(默认为 30 秒)在 SSL 握手期间等待数据时使用。如果超过超时时间,进程将停止并关闭套接字。
主机验证
从 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));
再次说明,构造函数参数禁用主机验证。