Obtaining TLS Client Certificates In Spring Integration
Spring Integration is a very powerful and extensible framework for, well, integrations. But sometimes it’s not trivial how to get some information that yo need. In my case – a certificate used for mutual authentication in a TLS (syslog over TLS) connection. You have a Java method that receives a Message
and ideally you’d want to get the certificate chain used by the client to authenticate itself (e.g. you may need to extract the CN).
Fortunately, Spring Integration is flexible. And it can be done, but it’s a bit convoluted. I’ll use XML notation, but the same can be achieved through Java config.
<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" />
The sslContextSupport
would typically be a org.springframework.integration.ip.tcp.connection.DefaultTcpSSLContextSupport
or a custom implementation (e.g. if you want to use a “blind” trust store)
Then you’d need the two classes. You can check them at their respective gists: TLSSyslogInterceptorFactory and TLSMutualNioConnectionSupport.
What do these classes do? The TLSSyslogInterceptorFactory
sets a new header for the message that contains the client ceritficates. The TLSMutualNioConnectionSupport
class sets the “wantClientAuth” option on the SSL Engine. There is another option – “needClientAuth” which would for client authentication, rather than just support it. Depending on the use case you can use one or the other.
Then you can obtain the certificates at your handler method via:
Certificate[] certificates = (Certificate[]) message.getHeaders().get(TLSSyslogInterceptorFactory.TLS_CLIENT_CERTIFICATES);
A small tip I wanted to share to help the next one trying to achieve that.
Published on Java Code Geeks with permission by Bozhidar Bozhanov, partner at our JCG program. See the original article here: Obtaining TLS Client Certificates In Spring Integration Opinions expressed by Java Code Geeks contributors are their own. |