SSL/TLS サポート

Secure Sockets Layer/Transport Layer Security がサポートされています。NIO を使用する場合、JDK 5+ SSLEngine 機能を使用して、接続の確立後にハンドシェイクを処理します。NIO を使用しない場合、標準の SSLSocketFactory および SSLServerSocketFactory オブジェクトを使用して接続が作成されます。大幅なカスタマイズを可能にするために、多くの戦略インターフェースが提供されています。これらのインターフェースのデフォルト実装は、安全な通信を開始する最も簡単な方法を提供します。

入門

NIO を使用するかどうかに関係なく、接続ファクトリで ssl-context-support 属性を構成する必要があります。この属性は、必要なキーストアの場所とパスワードを記述する <Bean/> 定義を参照します。

SSL/TLS ピアには、それぞれ 2 つのキーストアが必要です。

  • ピアを識別するための秘密鍵と公開鍵のペアを含むキーストア

  • 信頼されているピアの公開鍵を含むトラストストア。JDK で提供される keytool ユーティリティのドキュメントを参照してください。不可欠なステップは

    1. 新しいキーペアを作成し、キーストアに保存します。

    2. 公開鍵をエクスポートします。

    3. 公開鍵をピアのトラストストアにインポートします。

    4. 他のピアについても繰り返します。

テストケースでは、両方のピアで同じキーストアを使用するのが一般的ですが、本番環境ではこれを避ける必要があります。

キーストアを確立した後、次のステップは、それらのロケーションを 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 (デフォルト)にすることができます。

キーストアファイル名(最初の 2 つのコンストラクター引数)は、Spring Resource 抽象化を使用します。デフォルトでは、ファイルはクラスパスにありますが、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;
}

2 番目のコンストラクター引数は、ホスト検証を無効にします。次に、connectionSupport Bean が NIO 接続ファクトリに挿入されます。

NIO を使用しない場合、構成は TcpSocketSupport にあります。

connectionFactory.setTcpSocketSupport(new DefaultTcpSocketSupport(false));

繰り返しますが、コンストラクター引数はホスト検証を無効にします。