Spring Integration 是一個(gè)非常強(qiáng)大且可擴(kuò)展的繼承框架。但有時(shí),如何獲取你所需要的一些信息并非易事。就我而言 - 可以用于在 TLS(基于 TLS 的系統(tǒng)日志)連接中進(jìn)行相互身份驗(yàn)證的證書(shū)。你有一個(gè)接收消息的 Java 方法,理想情況下,你希望獲得客戶(hù)端使用的證書(shū)鏈來(lái)對(duì)其進(jìn)行身份驗(yàn)證(例如,你可能需要提取 CN)。
幸運(yùn)的是,Spring Integration 是靈活的。它可以做到,但它有點(diǎn)令人費(fèi)解。我將使用 XML 表示法,但同樣可以通過(guò) Java 配置來(lái)實(shí)現(xiàn)。
<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
?或自定義實(shí)現(xiàn)(例如,如果你想使用“blind”信任存儲(chǔ))
那你就需要這兩個(gè)類(lèi)??梢栽诟髯缘淖?cè)表中查看它們:?TLSSyslogInterceptorFactory
?和?TLSMUTAUALNIOCONNECTIONSUPPORT
?。
這些類(lèi)是用來(lái)做什么呢??TLSMutualNioConnectionSupport
?類(lèi)設(shè)置的SSL引擎“?wantClientAuth
?”選項(xiàng)。還有另一種選擇——“?needClientAuth
?”,它用于客戶(hù)端身份驗(yàn)證,而不僅僅是支持它。根據(jù)用例,你可以使用一種或另一種。
然后,您可以通過(guò)以下方式在處理程序方法中獲取證書(shū):
Certificate[] certificates = (Certificate[]) message.getHeaders().get(TLSSyslogInterceptorFactory.TLS_CLIENT_CERTIFICATES);
本篇文章的分享就到這里結(jié)束,希望能夠?qū)τ谙胍獓L試實(shí)現(xiàn)這個(gè)目標(biāo)的讀者有所幫助。