Java GSS-API および JSSE をいつ使用するか



Java GSS-API および JSSE のどちらも、次の基本的なセキュリティー機能セットを提供します。

  1. クライアント/サーバーの認証

  2. 転送データの暗号化および整合性保護

ただし、2 つには、重要な相違点があります。このドキュメントでは、使用中の環境でどちらのセキュリティー機構を使用するかを判断するのに役立つ、いくつかの相違点を示します。

  1. Kerberos シングルサインオンのサポート

    Java 2 Standard Edition では、GSS-API に Kerberos のサポートが必須のセキュリティー機構として含まれます。これは、使用するデスクトップが Kerberos をサポートする場合、ユーザーにパスワードの入力を決して求めない、Java GSS-API ベースのアプリケーションを記述できることを意味します。

    現在のところ、JSSE は Kerberos ベースの認証を使用する符号化方式をサポートしていません。この暗号スイートのサポートは、Internet Engineering Task Force (IETF) による TLS プロトコルの標準化作業に依存しています。

  2. 通信 API

    JSSE は、ソケットベースの API をサポートします。JSSE ソケットは java.net 内のソケットクラスを拡張し、JSSE ソケットファクトリは javax.net 内のソケットファクトリを拡張します。このため、記述したアプリケーションでソケットファクトリを介したセキュリティーが必要な場合、JSSE の方が適しています。JSSE ソケットでは、信頼できる転送手段を使用する必要があります。一般に、実装には TCP が使用されます。

    一方、Java GSS-API はトークンベースの API であり、通信の実行はアプリケーションに依存します。これは、アプリケーションが、TCP ソケット、UDP データグラム、または Java GSS-API により生成されたトークンの移送を許可する他の任意のチャンネルを使用できることを意味します。使用するアプリケーションがさまざまな通信プロトコルを必要とする場合、Java GSS-API の方が適しています。Java GSS-API は、入力および出力ストリームを使用して、トークンの読み取りおよび書き込みを実行できます。ただし、ストリーム自体を設定する必要があります。

  3. クレデンシャルの委譲

    Java GSS-API を使用すると、Kerberos の使用時に、クライアントからサーバーへクレデンシャルを委譲できます。アプリケーションが、バックエンド層との通信時に中間的存在がクライアントを装う必要がある多層環境に配備されている場合は、Java GSS-API の方が適しています。

  4. 選択的暗号化

    Java GSS-API はトークンベースであるため、特定のメッセージ (すべてではない) を選択的に暗号化できます。使用するアプリケーションでプレーンテキストと暗号テキストを混在させる必要がある場合には、Java GSS-API の方が適しています。

  5. プロトコル要件

    JSSE は RFC 2246 に定義されている TLS プロトコルの実装を提供します。 Java GSS-API は、RFC 2853 に定義されている GSS-API フレームワークの実装と、RFC 1964 に定義されている Kerberos バージョン 5 機構 (Microsoft Windows プラットフォームでは「SSPI with Kerberos」と呼ばれる) の実装を提供します。TLS を使用する HTTPS などのサーバーの場合、JSSE の方が適しています。SASL を使用する LDAP サーバーなどの他のサーバーでは、Kerberos 付きの GSS-API が必要な場合があります。この場合、Java GSS-API の方が適しています。