Spring integration Spring集成中的TLS和客户端身份验证

Spring integration Spring集成中的TLS和客户端身份验证,spring-integration,Spring Integration,我正在我的应用程序中试验TLS、相互TLS和主机验证,对集成组件的行为感到有些困惑。我使用的是TcpNetClientConnection工厂和TcpNetServerConnectionFactory。我对这些组件在引擎盖下是如何交互的没有很好的理解,我想确保我的身份验证按预期工作(或不工作) @Bean 公共TcpNetClientConnectionFactory tcpClientConnectionFactory(){ TcpNetClientConnectionFactory工厂=

我正在我的应用程序中试验TLS、相互TLS和主机验证,对集成组件的行为感到有些困惑。我使用的是
TcpNetClientConnection
工厂和
TcpNetServerConnectionFactory
。我对这些组件在引擎盖下是如何交互的没有很好的理解,我想确保我的身份验证按预期工作(或不工作)

@Bean
公共TcpNetClientConnectionFactory tcpClientConnectionFactory(){
TcpNetClientConnectionFactory工厂=
新TcpNetClientConnectionFactory(上游码头、上游进口);
setTcpSocketFactorySupport(tcpSslSocketFactorySupport);
setTcpSocketSupport(新的默认TCPSocketSupport(isHostVerificationEnabled));
返回工厂;
}
@豆子
TcpNetServerConnectionFactory测试TCPServerConnectionFactory(){
TcpNetServerConnectionFactory=新的TcpNetServerConnectionFactory(上游导入);
setTcpSocketFactorySupport(tcpSslSocketFactorySupport);
setTcpSocketSupport(新的默认TCPSocketSupport(isHostVerificationEnabled));
返回工厂;
}
@豆子
公共默认值tcpnetsslsocketfactorysupport tcpSslSocketFactorySupport(){
TcpSSLContextSupport sslContextSupport=新的默认TcpSSLContextSupport(密钥库、信任库、密钥Repassword、,
密码);
返回新的DefaultTcpNetSSLSocketFactorySupport(sslContextSupport);
}
创建
TcpSSLContextSupport
的唯一方法似乎是同时传递密钥库和信任库。为什么需要密钥库?如果我的服务器不需要客户端身份验证,我就不必向客户端连接工厂传递密钥库。客户端工厂应该只需要有一个信任库,就可以验证它正在与之通信的服务器

关于客户端身份验证,我的配置中的服务器连接工厂是否需要客户端身份验证?根据,为了启用客户端身份验证,我需要重写
postProcessServerSocket()
方法。然而,在我将客户端的证书添加到服务器的信任库之前,我一直在获取SSL读取异常。既然我还没有启用客户端身份验证,为什么有必要这么做


最后,如果客户机连接工厂的密钥库中确实有一个私钥条目,那么它在打开与服务器的连接时是否会自动使用该密钥?或者仅当服务器授权客户端身份验证时?似乎我的客户端连接工厂正在使用它的私钥,尽管我还没有设置任何强制客户端身份验证的内容。

服务器默认情况下不需要clientAuth;这里有一个

如果我在第437行注释掉代码

server.setTcpSocketSupport(新的DefaultTcpSocketSupport(false){
@凌驾
公共无效后处理服务器套接字(服务器套接字服务器套接字){
//((SSLServerSocket)serverSocket.setNeedClientAuth(true);
}
});
这项测试失败了

java.lang.AssertionError: 
Expecting code to raise a throwable.
    at org.springframework.integration.ip.tcp.connection.SocketSupportTests.testNetClientAndServerSSLDifferentContexts(SocketSupportTests.java:414)
AssertThatException类型(MessaginException.class)
.isThrownBy(()->testNetClientAndServerSSLDifferentContexts(true));
是的,默认实现需要密钥库,但它可以是空的,或者在不需要客户端身份验证时不包含客户端密钥。我们或许应该放松这一点;请随时打开GitHub问题来请求它。和/或您可以简单地提供自己的实现

在测试用例(预期失败)中,我们使用不包含客户机证书的密钥库

TcpSSLContextSupport客户端SSLCONTEXTSUPPORT=新的默认TcpSSLContextSupport(
badClient?“server.ks”:“client.ks”,
“client.truststore.ks”、“secret”、“secret”);

请注意,服务器套接字还具有
setWantsClientAuth
——可能默认为
true
,这将解释您观察到的情况(如果您在客户端提供证书,则会失败)。我还没有测试过;尝试将其设置为false。

注意,服务器套接字还具有
setWantsClientAuth
——可能默认为
true
,这可以解释您观察到的情况。我还没有测试过。你能重新发布测试用例的链接吗?该链接也返回到参考文档抱歉;链接已修复。