J2EE, .NET, Java™, HTTP 요청을 위한 웹 서비스 클라이언트를 위한 SPNEGO 토큰 작성

사용자의 애플리케이션을 위해 SPNEGO(Simple and Protected GSS-API Negotiation) 토큰을 작성하고 이 토큰을 WebSphere® Application Server에 인증하기 위해 HTTP 헤더에 삽입할 수 있습니다.

프로시저

  1. 클라이언트 GSS 신임 정보를 작성하십시오. 다음 4개의 옵션 중 하나를 선택하십시오.
    1. 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);
    2. 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;
                 }
             });
    3. 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);
    4. 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.&nbsp로부터의 세션 키를 포함하여, 전체 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)
  2. 클라이언트 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)를 필요로 할 수도 있습니다. 자세한 정보는 [AIX Solaris HP-UX Linux Windows]Kerberos 구성 파일 작성의 내용을 참조하십시오.


주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_SPNEGO_token
파일 이름:tsec_SPNEGO_token.html