第V部: SPNEGO Java GSSメカニズムを使用したセキュアな認証

課題8: SPNEGOとJava Generic Security Services (GSS) APIの使用

Java GSSは、複数のセキュリティ・メカニズムをサポートできるフレームワークです。GSS-APIの下でセキュリティ・メカニズムとネゴシエーションを行う方法が必要となります。これは、SPNEGOを介して使用できます。

SPNEGOはIETFにおいてRFC 4178に標準化されています。これは、基盤となるセキュリティ・メカニズムとのネゴシエーションを行う場合に使用する擬似セキュリティ・メカニズムです。これを使用すると、クライアントとサーバーに柔軟性が付与され、共通のGSSセキュリティ・メカニズムとセキュアにネゴシエーションを行うことができます。

MicrosoftはSPNEGOを多用しています。SPNEGOは、HTTPを介してMicrosoftサーバーと相互運用したり、Negotiateプロトコルを介してHTTPベースのクロス・プラットフォーム認証をサポートしたりする場合に使用できます。

現在、Java GSSとKerberosを使用する場合は、次のようにKerberos OIDを指定します。

Oid krb5Oid = new Oid("1.2.840.113554.1.2.2");

SPNEGOを使用するには、次のようにSPNEGO OIDを指定するだけです。

Oid spnegoOid = new Oid("1.3.6.1.5.5.2");

これにより、GSSCredentialGSSContextなどを作成する際にSPNEGO OIDを使用できます。

この課題の目標

現在、Java GSSで使用可能なセキュリティ・メカニズムはKerberosのみです。この課題の目標は、Simple and Protected GSS-API Negotiationメカニズム(SPNEGO)などの他のJava GSSメカニズムを使用して、アソシエーションをセキュリティ保護する方法について学習することです。

実行手順

  1. GssSpNegoClient.javaコードを参照してください。

  2. サンプル・コードをコンパイルします。

    % javac GssSpNegoClient.java
  3. GssSpNegoServer.javaコードを参照してください。

  4. サンプル・コードをコンパイルします。

    % javac GssSpNegoServer.java
  5. 新規のウィンドウを起動してサーバーを起動します。

    % java -Djava.security.auth.login.config=jaas-krb5.conf GssSpNegoServer
  6. クライアント・アプリケーションを実行します。GssSpNegoClientは、サービス名とそのサービスが実行されているサーバーの名前の2つのパラメータを取ります。たとえば、サービスがマシンj1hol-001上で実行されているhostの場合は、次を使用します(入力が求められたら、セキュアなパスワードを入力します)。

    % java -Djava.security.auth.login.config=jaas-krb5.conf \
    GssSpNegoClient host j1hol-001

    GssSpNegoServerを実行したサンプル出力:

    Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
    Waiting for incoming connections...
    Got connection from client /129.145.128.102
    SPNEGO Negotiated Mechanism = 1.2.840.113554.1.2.2 Kerberos V5
    Context Established!
    Client principal is test@J1LABS.EXAMPLE.COM
    Server principal is
    host/j1hol-001@J1LABS.EXAMPLE.COM
    Mutual authentication took place!
    Received data "Hello There!" of length 12
    Confidentiality applied: true
    Sending: Hello There! Thu May 06 12:11:15 PDT 2005

    GssSpNegoClientを実行したサンプル出力(passwordは、前に指定したパスワードに置き換えられます):

    Kerberos password for test: password
    Authenticated principal: [test@J1LABS.EXAMPLE.COM]
    Connected to address j1hol-001/129.145.128.102
    SPNEGO Negotiated Mechanism = 1.2.840.113554.1.2.2 Kerberos V5
    Context Established!
    Client principal is test@J1LABS.EXAMPLE.COM
    Server principal is host@j1hol-001
    Mutual authentication took place!
    Sending message: Hello There!
    Will read token of size 93
    Received message: Hello There! Thu May 06 12:11:15 PDT 2005

サマリー

この課題では、Kerberosなどのベースとなるセキュリティ・メカニズムとネゴシエーションを行い、ベースとなる認証システムとしてKerberosを使用してセキュアに通信を行うためにSPNEGOとともにJava GSS APIを使用するクライアント/サーバー・アプリケーションを記述する方法について学習しました。

注意:

Microsoftは特定のバリエーションのSPNEGOプロトコルを実装しています。このため、Microsoftと相互運用を行うために、新しいシステム・プロパティsun.security.spnego.msinteropを使用した個別のモードを追加しました。このプロパティは、デフォルトでtrueに有効にされています。無効にするには、このプロパティを明示的にfalseに設定する必要があります。SPNEGOデバッグを有効にするには、システム・プロパティsun.security.spnego.debug=trueを設定します。