J2EE, .NET, Java™, HTTP 요청을 위한 웹 서비스 클라이언트를 위한 SPNEGO 토큰 작성
사용자의 애플리케이션을 위해 SPNEGO(Simple and Protected GSS-API Negotiation) 토큰을 작성하고 이 토큰을 WebSphere® Application Server에 인증하기 위해 HTTP 헤더에 삽입할 수 있습니다.
프로시저
- 클라이언트 GSS 신임 정보를 작성하십시오. 다음 4개의 옵션 중 하나를 선택하십시오.
- Kerberos 신임 정보 캐시를 위한 GSS 신임 정보를 작성하십시오. 예를 들어 다음과 같습니다.
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 서버와 Windows XP SP2 베타에서 나타났습니다. 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)
- Kerberos 신임 정보 캐시를 위한 GSS 신임 정보를 작성하십시오. 예를 들어 다음과 같습니다.
- 클라이언트 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