HTTP 要求に対する J2EE、.NET、Java™、Web サービスの各クライアント用 SPNEGO トークンの作成
ご使用のアプリケーション用に Simple and Protected GSS-API Negotiation (SPNEGO) トークンを作成し、このトークンを HTTP ヘッダーに挿入して、WebSphere® Application Server に対する認証を行うことができます。
手順
- クライアント GSS クレデンシャルを作成します。以下の 4 つのオプションから 1 つを選択します。
- GSS クレデンシャルを Kerberos クレデンシャル・キャッシュ用に作成します。 以下に例を示します。
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); Oid krb5MechOid = new Oid("1.2.840.113554.1.2.2"); Oid spnegoMechOid = new Oid("1.3.6.1.5.5.2"); GSSManager manager = GSSManager.getInstance(); GSSName gssUserName = manager.createName(userName, GSSName.NT_USER_NAME, krb5MechOid); clientGssCreds = manager.createCredential(gssUserName.canonicalize(krb5MechOid), GSSCredential.INDEFINITE_LIFETIME, krb5MechOid, GSSCredential.INITIATE_ONLY); clientGssCreds.add (gssUserName, GSSCredential.INDEFINITE_LIFETIME, GSSCredential.INDEFINITE_LIFETIME, spnegoMechOid, GSSCredential.INITIATE_ONLY);
- Kerberos チケットを持つサブジェクトから GSS クレデンシャルを作成します。 以下に例を示します。
Oid krb5MechOid = new Oid("1.2.840.113554.1.2.2"); Oid spnegoMechOid = new Oid("1.3.6.1.5.5.2"); GSSManager manager = GSSManager.getInstance(); clientGssCreds = (GSSCredential) Subject.doAs(subject, new PrivilegedExceptionAction() { public Object run() throws GSSException, Exception { try { gssName = manager.createName( userName, GSSName.NT_USER_NAME, getKrb5MechOid()); GSSCredential gssCred = manager.createCredential( gssName.canonicalize(krb5MechOid), GSSCredential.DEFAULT_LIFETIME, krb5MechOid, GSSCredential.INITIATE_ONLY); gssCred.add (gssUserName, GSSCredential.INDEFINITE_LIFETIME, GSSCredential.INDEFINITE_LIFETIME, spnegoMechOid, GSSCredential.INITIATE_ONLY); return gssCred; } catch (GSSException gsse) { } catch (Exception e) { } return null; } });
- WSKRB5Login ログイン・モジュールを呼び出した後、GSS クレデンシャルを作成します。 以下に例を示します。
Oid krb5MechOid = new Oid("1.2.840.113554.1.2.2"); Oid spnegoMechOid = new Oid("1.3.6.1.5.5.2"); System.setProperty("javax.security.auth.useSubjectCredsOnly", "true"); GSSManager manager = GSSManager.getInstance(); GSSName gssUserName = manager.createName(userName, GSSName.NT_USER_NAME, krb5MechOid); clientGssCreds = manager.createCredential(gssUserName.canonicalize(krb5MechOid), GSSCredential.INDEFINITE_LIFETIME, krb5MechOid, GSSCredential.INITIATE_ONLY); clientGssCreds.add (gssUserName, GSSCredential.INDEFINITE_LIFETIME, GSSCredential.INDEFINITE_LIFETIME, spnegoMechOid, GSSCredential.INITIATE_ONLY);
- Microsoft ネイティブ Kerberos
クレデンシャル・キャッシュを使用して、GSS クレデンシャルを作成します。 以下に例を示します。
Oid krb5MechOid = new Oid("1.2.840.113554.1.2.2"); Oid spnegoMechOid = new Oid("1.3.6.1.5.5.2"); System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); GSSManager manager = GSSManager.getInstance(); clientGssCreds = manager.createCredential(null, GSSCredential.INDEFINITE_LIFETIME, krb5MechOid, GSSCredential.INITIATE_ONLY); clientGssCreds.add(null, GSSCredential.INDEFINITE_LIFETIME, GSSCredential.INDEFINITE_LIFETIME, spnegoMechOid, GSSCredential.INITIATE_ONLY);
注: MSLSA: クレデンシャル・キャッシュは、Kerberos LSA.  からのセッション鍵を含む Kerberos チケット全体を抽出する機能に依存します。 セキュリティー向上の試みでは、Microsoft は、まず、Ticket Getting Tickets のセッション鍵をエクスポートしない機能を実装しました。これにより、追加のサービス・チケットの要求の作成時に IBM® JGSS で役に立たないことがあります。この新フィーチャーは、Windows 2003 Server および Windows XP SP2 Beta にあります。Microsoft は、この新フィーチャーを使用不可にするために以下のレジストリー・キーを提供しています。HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥Lsa¥Kerberos¥Parameters AllowTGTSessionKey = 0x01 (DWORD)
Windows XP SP2 Beta 1 では、キーは以下のように指定されています。HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥Lsa¥Kerberos AllowTGTSessionKey = 0x01 (DWORD)
- GSS クレデンシャルを Kerberos クレデンシャル・キャッシュ用に作成します。 以下に例を示します。
- クライアント GSS クレデンシャルを作成した後、SPNEGO トークンを作成し、
それを以下の例のように HTTP ヘッダーに挿入することができます。
// create target server SPN GSSName gssServerName = manager.createName(targetServerSpn, GSSName.NT_USER_NAME); GSSContext clientContext = manager.createContext(gssServerName.canonicalize(spnegoMechOid), spnegoMechOid, clientGssCreds, GSSContext.DEFAULT_LIFETIME); // optional enable GSS credential delegation clientContext.requestCredDeleg(true); byte[] spnegoToken = new byte[0]; // create a SPNEGO token for the target server spnegoToken = clientContext.initSecContext(spnegoToken, 0, spnegoToken.length); URL url = new URL(targetUrl); HttpURLConnection con= (HttpURLConnection) url.openConnection(); try { // insert SPNEGO token in the HTTP header con.setRequestProperty("Authorization", "Negotiate " + Base64.encode(spnegoToken)); con.getResponseCode(); } catch (IOException e) { } catch (Exception ex) { }
タスクの結果
ご使用のアプリケーションで、Kerberos 構成ファイル (krb5.ini または krb5.conf) が必要になる場合があります。
詳しくは、Kerberos 構成ファイルの作成を参照してください。
関連タスク:


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_SPNEGO_token
ファイル名:tsec_SPNEGO_token.html