【发布时间】:2019-09-04 14:41:17
【问题描述】:
我正在我的应用程序中试验 TLS、双向 TLS 和主机验证,并且对集成组件的行为有些困惑。我正在使用TcpNetClientConnection 工厂和TcpNetServerConnectionFactory。我对这些组件如何在后台进行交互没有深入的了解,并希望确保我的身份验证按预期工作(或不工作)。
@Bean
public TcpNetClientConnectionFactory tcpClientConnectionFactory() {
TcpNetClientConnectionFactory factory =
new TcpNetClientConnectionFactory(upstreamHost, upstreamPort);
factory.setTcpSocketFactorySupport(tcpSslSocketFactorySupport);
factory.setTcpSocketSupport(new DefaultTcpSocketSupport(isHostVerificationEnabled));
return factory;
}
@Bean
TcpNetServerConnectionFactory testTcpServerConnectionFactory() {
TcpNetServerConnectionFactory factory = new TcpNetServerConnectionFactory(upstreamPort);
factory.setTcpSocketFactorySupport(tcpSslSocketFactorySupport);
factory.setTcpSocketSupport(new DefaultTcpSocketSupport(isHostVerificationEnabled));
return factory;
}
@Bean
public DefaultTcpNetSSLSocketFactorySupport tcpSslSocketFactorySupport() {
TcpSSLContextSupport sslContextSupport = new DefaultTcpSSLContextSupport(keyStore, trustStore, keyStorePassword,
trustStorePassword);
return new DefaultTcpNetSSLSocketFactorySupport(sslContextSupport);
}
似乎创建TcpSSLContextSupport 的唯一方法是将密钥库和信任库都传递给它。为什么需要密钥库?如果我的服务器不需要客户端身份验证,我不应该将密钥库传递给我的客户端连接工厂。客户端工厂应该只需要有一个信任库,以验证它正在与之交谈的服务器。
关于客户端身份验证,我的配置中的服务器连接工厂是否需要客户端身份验证?根据reference,为了启用客户端身份验证,我需要覆盖postProcessServerSocket() 方法。但是,在将客户端的证书添加到服务器的信任库之前,我遇到了 SSL 读取异常。为什么有必要,因为我还没有启用客户端身份验证?
最后,如果客户端连接工厂在其密钥库中确实有一个私钥条目,它会在打开与服务器的连接时自动使用该密钥吗?或者仅当服务器要求客户端身份验证时?似乎我的客户端连接工厂正在使用它的私钥,即使我还没有设置任何东西来强制客户端身份验证。
【问题讨论】: