对于最新的稳定版本,请使用 Spring Integration 6.4.0! |
SSL/TLS 支持
支持安全套接字层/传输层安全性。
使用蔚来时,使用 JDK 5+ 功能处理建立连接后的握手。
不使用 NIO 时,使用 standard 和 objects 创建连接。
提供了许多策略接口以允许进行重大自定义。
这些接口的默认实现提供了开始使用安全通信的最简单方法。SSLEngine
SSLSocketFactory
SSLServerSocketFactory
开始
无论您是否使用 NIO,都需要在连接工厂上配置该属性。
此属性引用 <bean/> 定义,该定义描述所需密钥库的位置和密码。ssl-context-support
SSL/TLS 对等体每个都需要两个密钥库:
-
包含私有密钥和公钥对的密钥库,用于标识对等节点
-
一个信任库,其中包含受信任的对等节点的公钥。 请参阅 JDK 随附的实用程序的文档。 基本步骤是
keytool
-
创建新的密钥对并将其存储在密钥库中。
-
导出公钥。
-
将公钥导入到对等节点的信任库中。
-
对另一个对等体重复上述步骤。
-
在测试用例中,在两个 Peer 节点上使用相同的密钥存储是很常见的,但在 production 中应避免这种情况。 |
建立密钥存储之后,下一步是向 Bean 指示它们的位置,并向连接工厂提供对该 Bean 的引用。TcpSSLContextSupport
以下示例配置 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" />
该类还有一个可选属性,可以是 or(默认值)。DefaultTcpSSLContextSupport
protocol
SSL
TLS
密钥库文件名(前两个构造函数参数)使用 Spring 抽象。
默认情况下,文件位于 Classpath 上,但您可以使用前缀覆盖它(以查找文件系统上的文件)。Resource
file:
从版本 4.3.6 开始,当您使用 NIO 时,您可以在连接工厂上指定 (以秒为单位)。
此超时(默认值为 30 秒)在 SSL 握手期间等待数据时使用。
如果超过超时,则停止进程并关闭套接字。ssl-handshake-timeout
房东验证
从版本 5.0.8 开始,您可以配置是否启用主机验证。 从版本 5.1 开始,它默认处于启用状态;禁用它的机制取决于您是否使用 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;
}
第二个 constructor 参数禁用主机验证。
然后将 bean 注入到 NIO 连接工厂中。connectionSupport
不使用 NIO 时,配置位于 :TcpSocketSupport
connectionFactory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));
同样,constructor 参数禁用主机验证。