对于最新的稳定版本,请使用 Spring Integration 6.3.1

对于最新的稳定版本,请使用 Spring Integration 6.3.1

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

开始

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

SSL/TLS 对等体需要两个密钥存储:

  • 包含用于标识对等方的私钥和公钥对的密钥库

  • 包含受信任对等方的公钥的信任库。 请参阅 JDK 随附的实用程序的文档。 基本步骤是keytool

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

    2. 导出公钥。

    3. 将公钥导入对等方的信任库。

    4. 对另一个对等方重复上述步骤。

在测试用例中,在两个对等体上使用相同的密钥存储是很常见的,但对于生产环境,应避免这种情况。

建立密钥存储后,下一步是向 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(默认值)。DefaultTcpSSLContextSupportprotocolSSLTLS

密钥库文件名(前两个构造函数参数)使用 Spring 抽象。 默认情况下,文件位于类路径上,但您可以使用前缀覆盖它(以在文件系统上查找文件)。Resourcefile:

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

在测试用例中,在两个对等体上使用相同的密钥存储是很常见的,但对于生产环境,应避免这种情况。

主机验证

从版本 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;
}

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

不使用 NIO 时,配置在:TcpSocketSupport

connectionFactory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));

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