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
抽象。默认情况下,文件位于 classpath 中,但您可以使用 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));
同样,构造函数参数禁用主机验证。