SSL/TLS 支援
支援安全套接層/傳輸層安全。使用 NIO 時,JDK 5+ 的 SSLEngine
特性用於處理連線建立後的握手。不使用 NIO 時,使用標準的 SSLSocketFactory
和 SSLServerSocketFactory
物件來建立連線。提供了許多策略介面,以允許進行顯著的自定義。這些介面的預設實現提供了開始安全通訊的最簡單方法。
入門
無論您是否使用 NIO,都需要在連線工廠上配置 ssl-context-support
屬性。此屬性引用一個 <bean/> 定義,該定義描述了所需金鑰庫的位置和密碼。
SSL/TLS 對等方每個都需要兩個金鑰庫
-
一個包含用於標識對等方的私鑰和公鑰對的金鑰庫
-
一個包含受信任對等方公鑰的信任庫。請參閱 JDK 提供的
keytool
工具的文件。主要步驟如下-
建立一個新的金鑰對並將其儲存在金鑰庫中。
-
匯出公鑰。
-
將公鑰匯入對等方的信任庫。
-
對另一個對等方重複此操作。
-
在測試用例中,通常在兩個對等方上使用相同的金鑰庫,但在生產環境中應避免這樣做。 |
建立金鑰庫後,下一步是將它們的位置告知 TcpSSLContextSupport
bean,並將該 bean 的引用提供給連線工廠。
以下示例配置了 SSL 連線
<bean id="sslContextSupport"
class="o.sf.integration.ip.tcp.connection.support.DefaultTcpSSLContextSupport">
<constructor-arg value="client.ks"/>
<constructor-arg value="client.truststore.ks"/>
<constructor-arg value="secret"/>
<constructor-arg value="secret"/>
</bean>
<ip:tcp-connection-factory id="clientFactory"
type="client"
host="localhost"
port="1234"
ssl-context-support="sslContextSupport" />
DefaultTcpSSLContextSupport
類還有一個可選的 protocol
屬性,可以是 SSL
或 TLS
(預設值)。
金鑰庫檔名(前兩個建構函式引數)使用了 Spring 的 Resource
抽象。預設情況下,檔案位於 classpath 中,但您可以使用 file:
字首來覆蓋此設定(以便在檔案系統中查詢檔案)。
從 4.3.6 版本開始,當您使用 NIO 時,可以在連線工廠上指定一個 ssl-handshake-timeout
(以秒為單位)。此超時(預設值為 30 秒)在 SSL 握手期間等待資料時使用。如果超過超時時間,程序將停止並關閉套接字。
主機驗證
從 5.0.8 版本開始,您可以配置是否啟用主機驗證。從 5.1 版本開始,預設啟用此功能;停用它的機制取決於您是否使用 NIO。
主機驗證用於確保您連線的伺服器與證書中的資訊匹配,即使證書是受信任的。
例如,使用 NIO 時,配置 DefaultTcpNioSSLConnectionSupport
。
@Bean
public DefaultTcpNioSSLConnectionSupport connectionSupport() {
DefaultTcpSSLContextSupport sslContextSupport = new DefaultTcpSSLContextSupport("test.ks",
"test.truststore.ks", "secret", "secret");
sslContextSupport.setProtocol("SSL");
DefaultTcpNioSSLConnectionSupport tcpNioConnectionSupport =
new DefaultTcpNioSSLConnectionSupport(sslContextSupport, false);
return tcpNioConnectionSupport;
}
第二個建構函式引數停用主機驗證。然後將 connectionSupport
bean 注入到 NIO 連線工廠中。
不使用 NIO 時,配置在 TcpSocketSupport
中
connectionFactory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));
同樣,建構函式引數停用主機驗證。