- 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允许应用程序在此类实现中设置提供程序偏好设置。 这些方法还允许实现抛出一个明确定义的异常,以防止不支持基于提供程序的配置。 期望可移植的应用程序应该意识到这一点,并通过捕获异常来彻底恢复。预计提供者将使用三种最常见的方式:
- 应用程序不关心使用的提供程序(默认情况)。
- 应用程序希望特定的提供者优先使用,无论是针对特定机制还是所有时间,无论机制如何。
- 应用程序希望尽可能地使用本地配置的提供程序,但是如果缺少一个或多个机制的支持,那么该应用程序想要退回到其自己的提供程序。
GSSManager
类有两种使能这些使用模式的方法:addProviderAtFront
和addProviderAtEnd
。 这些方法具有创建<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"); // 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
- 另请参见:
-
GSSName
,GSSCredential
,GSSContext
-
-
构造方法摘要
构造方法 Constructor 描述 GSSManager()
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract void
addProviderAtEnd(Provider p, Oid mech)
该方法用于向GSSManager指示,如果没有找到支持给定机制的其他提供程序,应用程序将希望使用特定的提供程序。abstract void
addProviderAtFront(Provider p, Oid mech)
该方法用于向GSSManager指示当给定机制需要支持时,应用程序希望在所有其他提供程序之前使用特定的提供程序。abstract GSSContext
createContext(byte[] interProcessToken)
用于创建先前导出的上下文的工厂方法。abstract GSSContext
createContext(GSSCredential myCred)
用于在受体侧创建上下文的工厂方法。abstract GSSContext
createContext(GSSName peer, Oid mech, GSSCredential myCred, int lifetime)
用于在启动者侧创建上下文的工厂方法。abstract GSSCredential
createCredential(int usage)
用于获取默认凭据的工厂方法。abstract GSSCredential
createCredential(GSSName name, int lifetime, Oid[] mechs, int usage)
用于通过一组机制获取凭据的工厂方法。abstract GSSCredential
createCredential(GSSName name, int lifetime, Oid mech, int usage)
用于获取单一机制凭证的工厂方法。abstract GSSName
createName(byte[] name, Oid nameType)
将包含名称的字节数组从指定的命名空间转换为GSSName对象的Factory方法。abstract GSSName
createName(byte[] name, Oid nameType, Oid mech)
将包含名称的字节数组从指定的命名空间转换为GSSName对象的Factory方法,并同时为机制进行规范化。abstract GSSName
createName(String nameStr, Oid nameType)
将字符串名称从指定的命名空间转换为GSSName对象的Factory方法。abstract GSSName
createName(String nameStr, Oid nameType, Oid mech)
将字符串名称从指定的命名空间转换为GSSName对象并将其同时用于机制进行规范化的Factory方法。static GSSManager
getInstance()
返回默认的GSSManager实现。abstract Oid[]
getMechs()
返回GSS-API调用者通过此GSSManager可用的机制列表。abstract Oid[]
getMechsForName(Oid nameType)
返回支持指定名称类型的机制列表。abstract Oid[]
getNamesForMech(Oid mech)
返回指定机制支持的名称类型。
-
-
-
方法详细信息
-
getInstance
public static GSSManager getInstance()
返回默认的GSSManager实现。- 结果
- GSSManager实现
-
getMechs
public abstract Oid[] getMechs()
返回GSS-API调用者通过此GSSManager可用的机制列表。 从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”),则返回的列表将包含至少以下nametypes:
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(Oid)
-
getMechsForName
public abstract Oid[] getMechsForName(Oid nameType)
返回支持指定名称类型的机制列表。在Kerberos v5机制(“1.2.840.113554.1.2.2”)将始终在此列表中,当指示NAMETYPE是一个返回
GSSName.NT_HOSTBASED_SERVICE
,GSSName.NT_EXPORT_NAME
,或“1.2.840.113554.1.2.2.1”。- 参数
-
nameType
- 要查找的名称类型的Oid - 结果
-
对应于支持指定名称类型的机制的Oid对象数组。
当没有找到支持指定名称类型的机制时,返回
null
。 - 另请参见:
-
getNamesForMech(Oid)
-
createName
public abstract GSSName createName(String nameStr, Oid nameType) throws GSSException
将字符串名称从指定的命名空间转换为GSSName对象的Factory方法。 通常,创建的GSSName
对象将包含多个表示形式的名称,每个支持的机制一个; 两个例外是这个例外,当命名空间类型参数指示NT_EXPORT_NAME或GSS-API实现不是多机制时。 不建议将此方法与NT_EXPORT_NAME类型一起使用,因为将以前导出的名称组合为字符串的任意字节可能会导致字符编码方案出现问题。 在这种情况下,建议将字节直接传递到此方法createName
的重载形式。- 参数
-
nameStr
- 表示要创建的名称的可打印形式的字符串。 -
nameType
- Oid指定提供的可打印名称的命名空间。null
可以用于指定每个检查nameStr的机制都应该具有机制特定的默认可打印语法。 使用这种方法使用数据类型NT_EXPORT_NAME是不可取的。 - 结果
- 表示指定的主体的GSSName
- 异常
-
GSSException
-包含以下主要错误代码:GSSException.BAD_NAMETYPE
,GSSException.BAD_NAME
,GSSException.BAD_MECH
,GSSException.FAILURE
- 另请参见:
-
GSSName
,GSSName.NT_EXPORT_NAME
-
createName
public abstract GSSName createName(byte[] name, Oid nameType) throws GSSException
将包含名称的字节数组从指定的命名空间转换为GSSName对象的Factory方法。 一般来说,创建的GSSName
对象将包含多个表示形式的名称,一个用于支持的每个机制; 两个例外是这个例外,当命名空间类型参数指示NT_EXPORT_NAME或GSS-API实现不是多机制时。 根据给定的数学类型选择的一些编码方案,传入的字节由每个底层机制解释。- 参数
-
name
- 包含要创建的名称的字节数组 -
nameType
- Oid指定字节数组中提供的名称的命名空间。null
可以用于指定检查字节数组的每个机制都应该假定机制特定的默认语法。 - 结果
- 表示指定的主体的GSSName
- 异常
-
GSSException
-包含以下主要错误代码:GSSException.BAD_NAMETYPE
,GSSException.BAD_NAME
,GSSException.BAD_MECH
,GSSException.FAILURE
- 另请参见:
-
GSSName
,GSSName.NT_EXPORT_NAME
-
createName
public abstract GSSName createName(String nameStr, Oid nameType, Oid mech) throws GSSException
将字符串名称从指定的命名空间转换为GSSName对象并将其同时用于机制进行规范化的Factory方法。 换句话说,这个方法是一个实用工具,它相当于两个步骤: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
- 另请参见:
-
GSSName.canonicalize(Oid)
,GSSName.NT_EXPORT_NAME
-
createName
public abstract GSSName createName(byte[] name, Oid nameType, Oid mech) throws GSSException
将包含名称的字节数组从指定的命名空间转换为GSSName对象的Factory方法,并同时为机制进行规范化。 换句话说,这个方法是一个实用工具,相当于两个步骤:createName
然后也是GSSName.canonicalize
。- 参数
-
name
- 包含要创建的名称的字节数组 -
nameType
- Oid指定字节数组中提供的名称的命名空间。null
可以用于指定每个检查字节数组的机制应该假定机制特定的默认语法。 -
mech
- Oid指定名称应该被规范化的机制 - 结果
- 表示指定的主体的GSSName
- 异常
-
GSSException
-包含以下主要错误代码:GSSException.BAD_NAMETYPE
,GSSException.BAD_NAME
,GSSException.BAD_MECH
,GSSException.FAILURE
- 另请参见:
-
GSSName.canonicalize(Oid)
,GSSName.NT_EXPORT_NAME
-
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
- 另请参见:
-
GSSCredential
-
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
- 另请参见:
-
GSSCredential
-
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
- 另请参见:
-
GSSCredential
-
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
- 另请参见:
-
GSSContext
-
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
- 另请参见:
-
GSSContext
-
createContext
public abstract GSSContext createContext(byte[] interProcessToken) throws GSSException
用于创建先前导出的上下文的工厂方法。 上下文属性将从输入令牌确定,不能通过set方法进行修改。实施不需要支持安全上下文的进程间传输。 在导出上下文之前,调用
GSSContext.isTransferable
将指示上下文是否可转移。 在不支持该方法的实现中调用此方法将导致GSSException
错误代码GSSException.UNAVAILABLE
。 一些机制提供者可能要求呼叫者被授予启动或接受安全上下文的权限。 失败的权限检查可能会导致从该方法抛出SecurityException
。- 参数
-
interProcessToken
- 以前从导出方法发出的令牌。 - 结果
- 以前建立的GSSContext
- 异常
-
GSSException
-包含以下主要错误代码:GSSException.NO_CONTEXT
,GSSException.DEFECTIVE_TOKEN
,GSSException.UNAVAILABLE
,GSSException.UNAUTHORIZED
,GSSException.FAILURE
- 另请参见:
-
GSSContext
-
addProviderAtFront
public abstract void addProviderAtFront(Provider p, Oid mech) throws GSSException
该方法用于向GSSManager指示当给定机制需要支持时,应用程序希望在所有其他提供程序之前使用特定的提供程序。 当使用null值而不是机制的一个Oid
,GSSManager必须在所有其他机构之前使用指定的提供者,无论机制是什么。 只有当指定的提供商不支持所需的机制时,GSSManager才会移动到不同的提供商。调用此方法可重复保留较旧的设置,但优先降低它们,从而形成提供者的有序列表,并在顶部增长
Oid
对。调用addProviderAtFront与null
Oid
将删除在GSSManager实例中为此提供程序设置的所有以前的首选项。 调用addProviderAtFront与非空的Oid
将删除任何以前使用这种机制和这个提供者一起设置的首选项。如果GSSManager实现不支持具有可插拔提供程序体系结构的SPI,那么它应该抛出GSSException状态代码GSSException.UNAVAILABLE以指示该操作不可用。
假设应用程序希望在需要任何机制时首先检查提供程序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);
现在如果还希望Oid m1的机制始终是在提供者B之前从先前设置的A被检查之前获得的,它会调用:mgr.addProviderAtFront(B, m1);
那么GSSManager会先检查一下是否需要m1。 如果B没有提供对m1的支持,则GSSManager将继续检查A.如果在m2与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
- 正在设置提供程序的机制 - 异常
-
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状态代码GSSException.UNAVAILABLE以指示该操作不可用。
假设应用程序希望当需要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
- 正在设置提供程序的机制 - 异常
-
GSSException
-包含以下主要错误代码:GSSException.UNAVAILABLE
,GSSException.FAILURE
-
-