如何在Spring集成中获取TLS客户端证书(附代码)

340 阅读1分钟

在Spring集成中获取TLS客户端证书

Spring Integration是一个非常强大和可扩展的框架,用于整合。但有时,如何获得一些你需要的信息并不简单。在我的案例中--在TLS(syslog over TLS)连接中用于相互认证的证书。你有一个接收Message 的Java方法,理想情况下,你想得到客户端用来认证自己的证书链(例如,你可能需要提取CN)。

幸运的是,Spring Integration很灵活。而这是可以做到的,但有点曲折。我将使用XML符号,但同样可以通过Java配置来实现。

<bean id="nioConnectionSupport" class="com.yourcompany.util.net.TLSMutualNioConnectionSupport">
        <constructor-arg ref="sslContextSupport" />
        <constructor-arg value="false" />
</bean>
<bean id="interceptorFactoryChain" class="org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
        <property name="interceptors">
            <bean class="com.yourcompany.util.net.TLSSyslogInterceptorFactory" />
        </property>
</bean>

<int-ip:tcp-connection-factory id="tlsConnectionFactory" type="server" port="${tcp.tls.port}"
                                   using-nio="true" nio-connection-support="nioConnectionSupport"
                                   single-use="false" interceptor-factory-chain="interceptorFactoryChain" />

sslContextSupport 通常是一个org.springframework.integration.ip.tcp.connection.DefaultTcpSSLContextSupport 或一个自定义的实现(例如,如果你想使用一个 "盲目的 "信任存储)。

这些类是做什么的?TLSSyslogInterceptorFactory 为包含客户端证书的消息设置一个新的头。TLSMutualNioConnectionSupport 类在SSL引擎上设置 "wantClientAuth "选项。还有另一个选项--"needClientAuth",它将用于客户端认证,而不仅仅是支持它。根据使用情况,你可以使用一个或另一个。

然后,你可以通过你的处理方法获得证书:

Certificate[] certificates = (Certificate[]) message.getHeaders().get(TLSSyslogInterceptorFactory.TLS_CLIENT_CERTIFICATES);

我想分享一个小提示,以帮助下一个试图实现这个目标的人。