跳到主要内容
版本:7.0.2

SSL/TLS 支持

DeepSeek V3 中英对照 SSL/TLS Support

支持安全套接字层/传输层安全协议。在使用NIO时,会利用JDK 5+的SSLEngine特性来处理连接建立后的握手过程。在不使用NIO的情况下,则采用标准的SSLSocketFactorySSLServerSocketFactory对象来创建连接。框架提供了多个策略接口,支持高度定制化。这些接口的默认实现提供了启动安全通信的最简方式。

快速开始

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

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

  • 一个包含私钥和公钥对的密钥库,用于标识对等节点

  • 一个包含受信任对等节点公钥的信任库。请参阅 JDK 提供的 keytool 工具的文档。基本步骤如下:

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

    2. 导出公钥。

    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 握手期间等待数据。如果超过超时时间,进程将停止并关闭套接字。

主机验证

从 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));

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