类 GSSManager

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

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

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

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

预计将有三种最常见的方式来使用提供商:

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

GSSManager 类有两种方法可以启用这些使用模式:addProviderAtFront addProviderAtEnd 。这些方法具有创建有序列表的效果<提供者,oid>对,其中每对表示提供者对给定 oid 的偏好。

请务必注意,由 GSSManager 创建的不同 GSS-API 对象之间存在某些交互,其中用于特定机制的提供程序可能需要在所有对象之间保持一致。例如,如果 GSSCredential 包含来自提供者的元素p对于一个机制m,它通常应该传递给将使用提供程序的 GSSContextp对于机制m.一个可以最大限度地提高可移植性的简单经验法则是,不应混合使用不同 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");

   // Identify who the client wishes to be
   GSSName userName = manager.createName("duke", GSSName.NT_USER_NAME);

   // Identify the name of the server. This uses a Kerberos specific
   // name format.
   GSSName serverName = manager.createName("nfs/foo.sun.com",
                       krb5PrincipalNameType);

   // Acquire credentials for the user
   GSSCredential userCreds = manager.createCredential(userName,
                       GSSCredential.DEFAULT_LIFETIME,
                       krb5Mechanism,
                       GSSCredential.INITIATE_ONLY);

   // Instantiate and initialize a security context that will be
   // established with the server
   GSSContext context = manager.createContext(serverName,
                        krb5Mechanism,
                        userCreds,
                        GSSContext.DEFAULT_LIFETIME);
 

服务端可能使用此源的以下变体:

   // Acquire credentials for the server
   GSSCredential serverCreds = manager.createCredential(serverName,
                       GSSCredential.DEFAULT_LIFETIME,
                       krb5Mechanism,
                       GSSCredential.ACCEPT_ONLY);

   // Instantiate and initialize a security context that will
   // wait for an establishment request token from the client
   GSSContext context = manager.createContext(serverCreds);
 
自从:
1.4
参见:
  • 构造方法详细信息

    • GSSManager

      public GSSManager()
      子类调用的构造方法。
  • 方法详情

    • 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_SERVICE GSSName.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_SERVICE GSSName.NT_EXPORT_NAME 或“1.2.840.113554.1.2.2.1”之一时,Kerberos v5 机制(“1.2.840.113554.1.2.2”)将始终在此list中返回。

      参数:
      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 类型一起使用,因为将以前导出的由任意字节组成的名称表示为 String 可能会导致字符编码方案出现问题。在这种情况下,建议将字节直接传递给此方法的重载形式 createName
      参数:
      nameStr - 表示要创建的名称的可打印形式的字符串。
      nameType - 指定所提供的可打印名称的命名空间的 Oid。 null 可用于指定检查 nameStr 的每个机制都应采用一种机制特定的默认可打印语法。不建议在此方法中使用名称类型 NT_EXPORT_NAME。
      返回:
      表示指定主体的 GSSName
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_NAMETYPE GSSException.BAD_NAME GSSException.BAD_MECH GSSException.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_NAMETYPE GSSException.BAD_NAME GSSException.BAD_MECH GSSException.FAILURE
      参见:
    • createName

      public abstract GSSName  createName(String  nameStr, Oid  nameType, Oid  mech) throws GSSException
      将指定命名空间中的字符串名称转换为 GSSName 对象并同时对其进行规范化的工厂方法。换句话说,此方法是一个实用程序,相当于执行两个步骤:createName ,然后是GSSName.canonicalize
      参数:
      nameStr - 表示要创建的名称的可打印形式的字符串。
      nameType - 指定所提供的可打印名称的命名空间的 Oid。 null 可用于指定检查 nameStr 的每个机制都应采用一种机制特定的默认可打印语法。不建议在此方法中使用名称类型 NT_EXPORT_NAME。
      mech - Oid 指定名称应规范化的机制
      返回:
      表示指定主体的 GSSName
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_NAMETYPE GSSException.BAD_NAME GSSException.BAD_MECH GSSException.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_NAMETYPE GSSException.BAD_NAME GSSException.BAD_MECH GSSException.FAILURE
      参见:
    • createCredential

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

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

      参数:
      usage - 此凭证对象的预期用途。此参数的值必须是以下之一:GSSCredential.INITIATE_AND_ACCEPT GSSCredential.ACCEPT_ONLY GSSCredential.INITIATE_ONLY
      返回:
      请求类型的 GSSCredential。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECH GSSException.BAD_NAMETYPE GSSException.BAD_NAME GSSException.CREDENTIALS_EXPIRED GSSException.NO_CRED GSSException.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_ACCEPT GSSCredential.ACCEPT_ONLY GSSCredential.INITIATE_ONLY
      返回:
      请求类型的 GSSCredential。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECH GSSException.BAD_NAMETYPE GSSException.BAD_NAME GSSException.CREDENTIALS_EXPIRED GSSException.NO_CRED GSSException.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_ACCEPT GSSCredential.ACCEPT_ONLY GSSCredential.INITIATE_ONLY
      返回:
      请求类型的 GSSCredential。
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.BAD_MECH GSSException.BAD_NAMETYPE GSSException.BAD_NAME GSSException.CREDENTIALS_EXPIRED GSSException.NO_CRED GSSException.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
      用于创建先前导出的上下文的工厂方法。上下文属性将根据输入令牌确定,不能通过 set 方法修改。

      实现不需要支持安全上下文的进程间传输。在导出上下文之前,调用 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 表明,当需要对给定机制提供支持时,应用程序希望先于所有其他提供程序使用特定提供程序。当为该机制使用 null 值而不是 Oid 时,无论机制是什么,GSSManager 都必须先于所有其他提供者使用指示的提供者。只有当指定的提供者不支持所需的机制时,GSSManager 才应该转向不同的提供者。

      重复调用此方法会保留较旧的设置,但会降低它们的优先级,从而形成在顶部增长的 provider 和 Oid 对的有序列表。

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

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

      假设一个应用程序希望在需要任何机制时始终首先检查提供者 A,它将调用:

           GSSManager mgr = GSSManager.getInstance();
           // mgr may at this point have its own pre-configured list
           // of provider preferences. The following will prepend to
           // any such list:
      
           mgr.addProviderAtFront(A, null);
       
      现在,如果它还希望在检查先前设置的 A 之前始终从提供者 B 获取 Oid m1 的机制,它将调用:
           mgr.addProviderAtFront(B, m1);
       
      如果需要 m1,则 GSSManager 将首先与 B 进行检查。如果 B 不为 m1 提供支持,则 GSSManager 将继续与 A 核对。如果需要任何机制 m2(其中 m2 与 m1 不同),则 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 - 设置提供者的机制
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.UNAVAILABLE GSSException.FAILURE
    • addProviderAtEnd

      public abstract void addProviderAtEnd(Provider  p, Oid  mech) throws GSSException
      此方法用于向 GSSManager 表明应用程序希望在找不到支持给定机制的其他提供程序时使用特定提供程序。当为机制使用 null 值而不是 Oid 时,GSSManager 必须为任何机制使用指示的提供者。

      重复调用此方法会保留较旧的设置,但优先将它们提升到较新的设置之上,从而形成在底部增长的提供程序和 Oid 对的有序列表。因此,将首先使用较旧的提供程序设置,然后再使用此设置。

      如果有任何先前存在的首选项与此处设置的首选项冲突,则 GSSManager 应忽略此请求。

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

      假设一个应用程序希望当需要 Oid m1 的机制时,总是首先检查系统默认提供者,只有当它们不支持 m1 时才检查提供者 A。然后它会调用:

           GSSManager mgr = GSSManager.getInstance();
           mgr.addProviderAtEnd(A, m1);
       
      现在,如果它还希望在检查所有已配置的提供者之后检查所有机制的提供者 B,那么它会调用: , 无效的)}。

      假设稍后对同一 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 - 设置提供者的机制
      抛出:
      GSSException - 包含以下主要错误代码:GSSException.UNAVAILABLE GSSException.FAILURE