Package org.ietf.jgss

Class GSSManager

java.lang.Object
org.ietf.jgss.GSSManager

public abstract class GSSManager extends Object
这个类作为其他重要的GSS-API类的工厂,并提供有关支持的机制的信息。它可以创建实现以下三个GSS-API接口的类的实例:GSSNameGSSCredentialGSSContext。它还具有查询可用机制列表和每个机制支持的名称类型的方法。

可以通过静态方法getInstance获得默认GSSManager子类的实例,但应用程序可以自由实例化GSSManager的其他子类。默认的GSSManager实例将支持Kerberos v5 GSS-API机制以及其他任何机制。此机制由Oid“1.2.840.113554.1.2.2”标识,并在RFC 1964中定义。

扩展GSSManager抽象类的子类可以实现为基于模块化提供程序的层,该层利用一些众所周知的服务提供程序规范。GSSManager API允许应用程序在这种实现上设置提供程序首选项。这些方法还允许实现在不支持基于提供程序的配置的情况下抛出一个明确定义的异常。期望具有可移植性的应用程序应该意识到这一点,并通过捕获异常来清洁恢复。

预计提供程序将以三种最常见的方式使用:

  1. 应用程序不关心使用哪个提供程序(默认情况)。
  2. 应用程序希望优先使用特定提供程序,无论是针对特定机制还是始终如此,而不考虑机制。
  3. 应用程序希望尽可能使用本地配置的提供程序,但如果一个或多个机制缺少支持,则希望退回到自己的提供程序。

GSSManager类有两个方法,可以启用这些用法模式:addProviderAtFrontaddProviderAtEnd。这些方法的效果是创建一个有序的<provider, oid>对列表,其中每个对指示给定oid的提供程序的首选项。

重要的是要注意,由GSSManager创建的不同GSS-API对象之间存在某些交互,用于特定机制的提供程序可能需要在所有对象上保持一致。例如,如果一个GSSCredential包含来自机制m的提供程序p的元素,则通常应将其传递给将使用提供程序p的机制m的GSSContext。最大程度地提高可移植性的一个简单经验法则是,不应混合从不同GSSManager创建的对象,如果可能的话,如果应用程序希望在已经创建对象的GSSManager上调用addProviderAtFront方法,则应创建一个不同的GSSManager实例。

以下是展示如何使用GSSManager的示例代码:

     GSSManager manager = GSSManager.getInstance();

     Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
     Oid krb5PrincipalNameType = new Oid("1.2.840.113554.1.2.2.1");

     // 确定客户端希望成为谁
     GSSName userName = manager.createName("duke", GSSName.NT_USER_NAME);

     // 确定服务器的名称。这使用了Kerberos特定的名称格式。
     GSSName serverName = manager.createName("nfs/foo.sun.com",
                                             krb5PrincipalNameType);

     // 为用户获取凭据
     GSSCredential userCreds = manager.createCredential(userName,
                                             GSSCredential.DEFAULT_LIFETIME,
                                             krb5Mechanism,
                                             GSSCredential.INITIATE_ONLY);

     // 实例化和初始化将与服务器建立的安全上下文
     GSSContext context = manager.createContext(serverName,
                                                krb5Mechanism,
                                                userCreds,
                                                GSSContext.DEFAULT_LIFETIME);
 

服务器端可能使用以下变体:

     // 为服务器获取凭据
     GSSCredential serverCreds = manager.createCredential(serverName,
                                             GSSCredential.DEFAULT_LIFETIME,
                                             krb5Mechanism,
                                             GSSCredential.ACCEPT_ONLY);

     // 实例化和初始化将等待来自客户端的建立请求令牌的安全上下文
     GSSContext context = manager.createContext(serverCreds);
 
自从:
1.4
参见:
  • Constructor Details

    • GSSManager

      public GSSManager()
      子类调用的构造函数。
  • Method Details

    • getInstance

      public static GSSManager getInstance()
      返回默认的GSSManager实现。
      返回:
      一个GSSManager实现
    • getMechs

      public abstract Oid[] getMechs()
      返回通过此GSSManager对GSS-API调用者可用的机制列表。从getInstance()方法获得的默认GSSManager在其列表中包含Oid“1.2.840.113554.1.2.2”。此Oid标识在RFC 1964中定义的Kerberos v5 GSS-API机制。
      返回:
      一个数组,其中包含可用机制的Oid对象。当没有机制可用时返回null值(例如,当机制动态配置,并且当前未安装任何机制时)。
    • getNamesForMech

      public abstract Oid[] getNamesForMech(Oid mech) throws GSSException
      返回指定机制支持的名称类型。

      默认的GSSManager实例包括对Kerberos v5机制的支持。当指定此机制(“1.2.840.113554.1.2.2”)时,返回的列表将至少包含以下名称类型:GSSName.NT_HOSTBASED_SERVICEGSSName.NT_EXPORT_NAME和Kerberos v5特定的Oid“1.2.840.113554.1.2.2.1”。Oid“1.2.840.113554.1.2.2.1”的命名空间在RFC 1964中定义。

      参数:
      mech - 要查询的机制的Oid
      返回:
      一个数组,其中包含机制支持的名称类型的Oid对象。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECH GSSException.FAILURE
      参见:
    • getMechsForName

      public abstract Oid[] getMechsForName(Oid nameType)
      返回支持指定名称类型的机制列表。

      当指定的名称类型是GSSName.NT_HOSTBASED_SERVICEGSSName.NT_EXPORT_NAME或“1.2.840.113554.1.2.2.1”时,将始终在此列表中返回Kerberos v5机制(“1.2.840.113554.1.2.2”)。

      参数:
      nameType - 要查找的名称类型的Oid
      返回:
      一个数组,其中包含支持指定名称类型的机制的Oid对象。当找不到支持指定名称类型的机制时返回null
      参见:
    • createName

      public abstract GSSName createName(String nameStr, Oid nameType) throws GSSException
      将指定命名空间中的字符串名称转换为GSSName对象的工厂方法。一般来说,创建的GSSName对象将包含名称的多个表示,每个表示对应于支持的每个机制;两个例外情况是当命名空间类型参数指示NT_EXPORT_NAME或GSS-API实现不是多机制时。不建议将此方法与NT_EXPORT_NAME类型一起使用,因为将包含任意字节的先前导出名称表示为字符串可能会导致字符编码方案的问题。在这种情况下,建议直接将字节传递给此方法的重载形式createName
      参数:
      nameStr - 表示要创建的名称的可打印形式的字符串。
      nameType - 指定提供的可打印名称的命名空间的Oid。可以使用null来指定每个检查nameStr的机制应假定机制特定的默认可打印语法。不建议在此方法中使用nametype NT_EXPORT_NAME。
      返回:
      代表指定主体的GSSName
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.BAD_MECHGSSException.FAILURE
      参见:
    • createName

      public abstract GSSName createName(byte[] name, Oid nameType) throws GSSException
      从指定命名空间中的字节数组转换为GSSName对象的工厂方法。一般来说,创建的GSSName对象将包含名称的多个表示,每个受支持的机制一个;两个例外是当命名空间类型参数指示NT_EXPORT_NAME或当GSS-API实现不是多机制时。传入的字节将由每个底层机制根据其选择的某种编码方案对给定名称类型的字节进行解释。
      参数:
      name - 包含要创建的名称的字节数组
      nameType - 指定字节数组中提供的名称的命名空间的Oid。可以使用null来指定每个检查字节数组的机制应假定机制特定的默认语法。
      返回:
      代表指定主体的GSSName
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.BAD_MECHGSSException.FAILURE
      参见:
    • createName

      public abstract GSSName createName(String nameStr, Oid nameType, Oid mech) throws GSSException
      将指定命名空间中的字符串名称转换为GSSName对象并同时为机制规范化它的工厂方法。换句话说,此方法是执行两个步骤的等效工具:执行createName,然后还执行GSSName.canonicalize
      参数:
      nameStr - 表示要创建的名称的可打印形式的字符串。
      nameType - 指定提供的可打印名称的命名空间的Oid。可以使用null来指定每个检查nameStr的机制应假定机制特定的默认可打印语法。不建议在此方法中使用nametype NT_EXPORT_NAME。
      mech - 指定应为其规范化名称的机制的Oid
      返回:
      代表指定主体的GSSName
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.BAD_MECHGSSException.FAILURE
      参见:
    • createName

      public abstract GSSName createName(byte[] name, Oid nameType, Oid mech) throws GSSException
      将包含来自指定命名空间的名称的字节数组转换为GSSName对象并同时为机制规范化它的工厂方法。换句话说,此方法是执行两个步骤的等效工具:执行createName,然后还执行GSSName.canonicalize
      参数:
      name - 包含要创建的名称的字节数组
      nameType - 指定字节数组中提供的名称的命名空间的Oid。可以使用null来指定每个检查字节数组的机制应假定机制特定的默认语法。
      mech - 指定应为其规范化名称的机制的Oid
      返回:
      代表指定主体的GSSName
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.BAD_MECHGSSException.FAILURE
      参见:
    • createCredential

      public abstract GSSCredential createCredential(int usage) throws GSSException
      获取默认凭据的工厂方法。这将导致GSS-API使用系统特定的默认值来设置机制、名称和生存期。

      GSS-API机制提供程序必须对调用者施加本地访问控制策略,以防止未经授权的调用者获取他们无权获得的凭据。不同机制提供程序所需的权限类型将在每个机制的基础上进行文档化。权限检查失败可能会导致从此方法抛出SecurityException

      参数:
      usage - 此凭据对象的预期用途。此参数的值必须是以下之一:GSSCredential.INITIATE_AND_ACCEPTGSSCredential.ACCEPT_ONLYGSSCredential.INITIATE_ONLY
      返回:
      请求类型的GSSCredential。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECHGSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.CREDENTIALS_EXPIREDGSSException.NO_CREDGSSException.FAILURE
      参见:
    • createCredential

      public abstract GSSCredential createCredential(GSSName name, int lifetime, Oid mech, int usage) throws GSSException
      获取单个机制凭据的工厂方法。

      GSS-API机制提供程序必须对调用者施加本地访问控制策略,以防止未经授权的调用者获取他们无权获得的凭据。不同机制提供程序所需的权限类型将在每个机制的基础上进行文档化。权限检查失败可能会导致从此方法抛出SecurityException

      底层机制并非总是能够始终遵守寿命的非默认值,因此应用程序应准备在返回的凭据上调用getRemainingLifetime

      参数:
      name - 要获取凭据的主体的名称。使用null指定默认主体。
      lifetime - 凭据应保持有效的秒数。使用GSSCredential.INDEFINITE_LIFETIME请求凭据具有最大允许寿命。使用GSSCredential.DEFAULT_LIFETIME请求默认凭据寿命。
      mech - 所需机制的Oid。使用(Oid) null 请求默认机制。
      usage - 此凭据对象的预期用途。此参数的值必须是以下之一:GSSCredential.INITIATE_AND_ACCEPTGSSCredential.ACCEPT_ONLYGSSCredential.INITIATE_ONLY
      返回:
      请求类型的GSSCredential。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECHGSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.CREDENTIALS_EXPIREDGSSException.NO_CREDGSSException.FAILURE
      参见:
    • createCredential

      public abstract GSSCredential createCredential(GSSName name, int lifetime, Oid[] mechs, int usage) throws GSSException
      获取一组机制上的凭据的工厂方法。此方法尝试为数组mechs中指定的每个机制获取凭据。要确定成功获取凭据的机制列表,调用者应使用GSSCredential.getMechs方法。

      GSS-API机制提供程序必须对调用者施加本地访问控制策略,以防止未经授权的调用者获取他们无权获取的凭据。不同机制提供程序所需的权限类型将在每个机制的基础上进行文档记录。权限检查失败可能会导致从此方法抛出SecurityException。

      底层机制并非总是能够遵守寿命的非默认值,因此应用程序应准备在返回的凭据上调用getRemainingLifetime。

      参数:
      name - 要获取凭据的主体的名称。使用null指定默认主体。
      lifetime - 凭据应保持有效的秒数。使用GSSCredential.INDEFINITE_LIFETIME请求凭据具有最大允许的寿命。使用GSSCredential.DEFAULT_LIFETIME请求默认凭据寿命。
      mechs - 指示要获取凭据的机制的Oid数组。使用(Oid[]) null请求系统特定默认机制集。
      usage - 此凭据对象的预期用途。此参数的值必须是以下之一:GSSCredential.INITIATE_AND_ACCEPTGSSCredential.ACCEPT_ONLYGSSCredential.INITIATE_ONLY
      返回:
      请求类型的GSSCredential。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECHGSSException.BAD_NAMETYPEGSSException.BAD_NAMEGSSException.CREDENTIALS_EXPIREDGSSException.NO_CREDGSSException.FAILURE
      参见:
    • createContext

      public abstract GSSContext createContext(GSSName peer, Oid mech, GSSCredential myCred, int lifetime) throws GSSException
      在发起方创建上下文的工厂方法。某些机制提供程序可能要求调用者被授予启动安全上下文的权限。权限检查失败可能会导致从此方法抛出SecurityException。

      底层机制并非总是能够遵守寿命的非默认值,因此应用程序应准备在返回的上下文上调用getLifetime。

      参数:
      peer - 目标对等体的名称。
      mech - 所需机制的Oid。使用null请求默认机制。
      myCred - 启动者的凭据。使用null作为默认启动者主体。
      lifetime - 请求上下文的寿命,以秒为单位。使用GSSContext.INDEFINITE_LIFETIME请求上下文具有最大允许的寿命。使用GSSContext.DEFAULT_LIFETIME请求上下文的默认寿命。
      返回:
      一个未建立的GSSContext
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.NO_CRED GSSException.CREDENTIALS_EXPIRED GSSException.BAD_NAMETYPE GSSException.BAD_MECH GSSException.FAILURE
      参见:
    • createContext

      public abstract GSSContext createContext(GSSCredential myCred) throws GSSException
      在接收方创建上下文的工厂方法。上下文的属性将根据提供给accept方法的输入令牌确定。某些机制提供程序可能要求调用者被授予接受安全上下文的权限。权限检查失败可能会导致从此方法抛出SecurityException。
      参数:
      myCred - 接收者的凭据。使用null作为默认接收者主体。
      返回:
      一个未建立的GSSContext
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.NO_CRED GSSException.CREDENTIALS_EXPIRED GSSException.BAD_MECH GSSException.FAILURE
      参见:
    • createContext

      public abstract GSSContext createContext(byte[] interProcessToken) throws GSSException
      用于创建先前导出的上下文的工厂方法。上下文属性将根据输入令牌确定,不能通过设置方法进行修改。

      实现不需要支持安全上下文的进程间传输。在导出上下文之前,调用GSSContext.isTransferable将指示上下文是否可传输。在不支持该功能的实现中调用此方法将导致带有错误代码GSSException.UNAVAILABLE的GSSException。某些机制提供程序可能要求调用者被授予启动或接受安全上下文的权限。权限检查失败可能会导致从此方法抛出SecurityException。

      参数:
      interProcessToken - 之前从导出方法发出的令牌。
      返回:
      先前建立的GSSContext
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.NO_CONTEXT, GSSException.DEFECTIVE_TOKEN, GSSException.UNAVAILABLE, GSSException.UNAUTHORIZED, GSSException.FAILURE
      参见:
    • addProviderAtFront

      public abstract void addProviderAtFront(Provider p, Oid mech) throws GSSException
      此方法用于指示GSSManager应用程序希望在需要支持给定机制时首先使用特定提供程序。当机制的Oid用于null值而不是提供程序时,GSSManager必须优先使用指定的提供程序,无论机制是什么。仅当指定的提供程序不支持所需的机制时,GSSManager才应继续移动到不同的提供程序。

      重复调用此方法会保留旧设置,但降低其优先级,从而形成一个提供程序和Oid对的有序列表,该列表在顶部增长。

      使用null Oid调用addProviderAtFront将删除GSSManager实例为该提供程序设置的所有先前首选项。使用非null Oid调用addProviderAtFront将删除使用此机制和此提供程序一起设置的任何先前首选项。

      如果GSSManager实现不支持具有可插拔提供程序架构的SPI,则应抛出具有状态代码GSSException.UNAVAILABLE的GSSException,以指示操作不可用。

      假设应用程序希望始终首先检查提供程序A是否需要任何机制,则会调用:

               GSSManager mgr = GSSManager.getInstance();
               // mgr可能在此时具有自己预配置的提供程序首选项列表。以下将添加到任何此类列表:
      
               mgr.addProviderAtFront(A, null);
       
      现在,如果还希望机制Oid m1始终从提供程序B获取,而不是之前设置的A被检查,则会调用:
               mgr.addProviderAtFront(B, m1);
       
      然后,GSSManager将首先检查B是否需要m1。如果B不支持m1,则GSSManager将继续检查A。如果需要任何不同于m1的机制m2,则GSSManager将直接跳过B并直接检查A。

      假设稍后对同一GSSManager实例进行以下调用:

               mgr.addProviderAtFront(B, null)
       
      然后,先前设置的对(B, m1)的设置将被此设置所取代并应予以删除。有效地,首选项列表现在变为{(B, null), (A, null), ... //接着是预配置的列表。

               mgr.addProviderAtFront(A, m3)
       
      不会取代先前设置的(A, null),列表将有效地变为{(A, m3), (B, null), (A, null), ...}
      参数:
      p - 应该在需要支持 mech 时使用的提供程序实例。
      mech - 要设置提供程序的机制
      抛出:
      GSSException - 包含以下主要错误代码: GSSException.UNAVAILABLE, GSSException.FAILURE
    • addProviderAtEnd

      public abstract void addProviderAtEnd(Provider p, Oid mech) throws GSSException
      该方法用于指示 GSSManager,如果找不到支持给定机制的其他提供程序,则应使用特定提供程序。当机制的 Oid 而不是 null 值用于机制时,GSSManager 必须对任何机制使用指定的提供程序。

      重复调用此方法会保留旧设置,但会将其优先级提高到新设置之上,从而形成一个按顺序增长的提供程序和 Oid 对列表。因此,在使用此设置之前将首先使用旧的提供程序设置。

      如果存在与此处设置的偏好冲突的先前存在的偏好,则 GSSManager 应忽略此请求。

      如果 GSSManager 实现不支持具有可插入提供程序架构的 SPI,则应抛出具有状态代码 GSSException.UNAVAILABLE 的 GSSException,以指示操作不可用。

      假设应用程序希望在需要 Oid m1 的机制时始终首先检查系统默认提供程序,仅当它们不支持 m1 时才应检查提供程序 A。然后会进行以下调用:

               GSSManager mgr = GSSManager.getInstance();
               mgr.addProviderAtEnd(A, m1);
       
      现在,如果还希望在检查所有配置的提供程序后始终检查提供程序 B,那么会调用:
               mgr.addProviderAtEnd(B, null);
       
      实际上,偏好列表现在变为 {..., (A, m1), (B, null)}。

      假设稍后对同一 GSSManager 实例进行以下调用:

               mgr.addProviderAtEnd(B, m2)
       
      那么具有对 (B, null) 的先前设置包含此设置,因此应忽略此请求。如果对已存在的 (A, m1) 或 (B, null) 对进行请求,则会发生相同情况。

      但请注意,以下调用:

               mgr.addProviderAtEnd(A, null)
       
      不会被先前的 (A, m1) 设置所包含,列表将实际上变为 {..., (A, m1), (B, null), (A, null)}
      参数:
      p - 应该在需要支持 mech 时使用的提供程序实例。
      mech - 要设置提供程序的机制
      抛出:
      GSSException - 包含以下主要错误代码: GSSException.UNAVAILABLE, GSSException.FAILURE