SSL/TLS 支援

支援安全通訊端層/傳輸層安全。當使用 NIO 時,JDK 5+ SSLEngine 功能用於處理連線建立後的交握。當不使用 NIO 時,標準 SSLSocketFactorySSLServerSocketFactory 物件用於建立連線。提供許多策略介面以允許大幅自訂。這些介面的預設實作提供了開始安全通訊的最簡單方式。

入門指南

無論您是否使用 NIO,您都需要在連線 Factory 上設定 ssl-context-support 屬性。此屬性參考描述所需金鑰儲存庫位置和密碼的 <bean/> 定義。

SSL/TLS 對等點各自需要兩個金鑰儲存庫

  • 一個包含私密金鑰和公開金鑰對的金鑰儲存庫,用於識別對等點

  • 一個信任儲存庫,包含受信任對等點的公開金鑰。請參閱 JDK 提供的 keytool 公用程式文件。基本步驟如下

    1. 建立新的金鑰對並將其儲存在金鑰儲存庫中。

    2. 匯出公開金鑰。

    3. 將公開金鑰匯入對等點的信任儲存庫中。

    4. 為另一個對等點重複執行。

在測試案例中使用相同金鑰儲存庫在兩個對等點上是很常見的,但在生產環境中應避免這樣做。

建立金鑰儲存庫後,下一步是向 TcpSSLContextSupport Bean 指示其位置,並向連線 Factory 提供對該 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 屬性,可以是 SSLTLS (預設值)。

金鑰儲存庫檔案名稱 (前兩個建構子引數) 使用 Spring Resource 抽象。預設情況下,檔案位於類別路徑中,但您可以透過使用 file: 字首來覆寫此設定 (以在檔案系統上尋找檔案)。

從 4.3.6 版開始,當您使用 NIO 時,您可以在連線 Factory 上指定 ssl-handshake-timeout (以秒為單位)。此逾時 (預設值為 30 秒) 用於 SSL 交握期間等待資料時。如果超過逾時,則會停止程序並關閉 Socket。

主機驗證

從 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 連線 Factory 中。

當不使用 NIO 時,設定位於 TcpSocketSupport

connectionFactory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));

同樣,建構子引數停用主機驗證。