public abstract class GSSManager extends Object
GSSName
, GSSCredential
和GSSContext
。
它还具有查询可用机制列表和每种机制支持的参数的方法。
默认的GSSManager
子类的实例可以通过静态方法getInstance
获得 ,但应用程序可以自由地实例化GSSManager的其他子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
上调用addProviderAtFront
方法。
以下是一些示例代码,显示如何使用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);
GSSName
, GSSCredential
, GSSContext
Constructor and Description |
---|
GSSManager() |
Modifier and Type | Method and Description |
---|---|
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(GSSName name, int lifetime, Oid[] mechs, int usage)
用于通过一组机制获取凭据的工厂方法。
|
abstract GSSCredential |
createCredential(GSSName name, int lifetime, Oid mech, int usage)
用于获取单一机制凭证的工厂方法。
|
abstract GSSCredential |
createCredential(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)
返回指定机制支持的名称类型。
|
public static GSSManager getInstance()
public abstract Oid[] getMechs()
getInstance()
方法获取的默认GSSManager在其列表中包含Oid“1.2.840.113554.1.2.2”。
此Oid标识了RFC 1964中定义的Kerberos v5 GSS-API机制。
null
时,返回一个null
值(一个例子是动态配置机制,当前没有安装任何机制)。
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
GSSException
- 包含以下主要错误代码:
GSSException.BAD_MECH
GSSException.FAILURE
getMechsForName(Oid)
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
null
时返回null。
getNamesForMech(Oid)
public abstract GSSName createName(String nameStr, Oid nameType) throws GSSException
GSSName
对象将包含该名称的多个表示,一个用于支持的每个机制;
两个例外是这个例外,当命名空间类型参数指示NT_EXPORT_NAME或GSS-API实现不是多机制时。
不建议将此方法与NT_EXPORT_NAME类型一起使用,因为将以前导出的名称组合为字符串的任意字节可能会导致字符编码方案出现问题。
在这种情况下,建议将字节直接传递到此方法createName
的重载形式。
nameStr
- 表示要创建的名称的可打印形式的字符串。
nameType
- Oid指定提供的可打印名称的命名空间。
null
可以用于指定每个检查nameStr的机制都假设机制特定的默认可打印语法。
使用这种方法使用数据类型NT_EXPORT_NAME是不可取的。
GSSException
-包含以下主要错误代码:
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.BAD_MECH
,
GSSException.FAILURE
GSSName
, GSSName.NT_EXPORT_NAME
public abstract GSSName createName(byte[] name, Oid nameType) throws GSSException
GSSName
对象将包含多个表示名称,一个表示支持的每个机制;
两个例外是这个例外,当命名空间类型参数指示NT_EXPORT_NAME或GSS-API实现不是多机制时。
根据给定的数学类型选择的一些编码方案,传入的字节由每个底层机制解释。
name
- 包含要创建的名称的字节数组
nameType
- Oid指定字节数组中提供的名称的命名空间。
null
可以用于指定每个检查字节数组的机制应该假定机制特定的默认语法。
GSSException
-包含以下主要错误代码:
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.BAD_MECH
,
GSSException.FAILURE
GSSName
, GSSName.NT_EXPORT_NAME
public abstract GSSName createName(String nameStr, Oid nameType, Oid mech) throws GSSException
createName
然后也是GSSName.canonicalize
。
nameStr
- 表示要创建的名称的可打印形式的字符串。
nameType
- Oid指定提供的可打印名称的命名空间。
null
可用于指定检查nameStr的每个机制都应该假定机制特定的默认可打印语法。
使用这种方法使用数据类型NT_EXPORT_NAME是不可取的。
mech
- Oid指定名称应该被规范化的机制
GSSException
-包含以下主要错误代码:
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.BAD_MECH
,
GSSException.FAILURE
GSSName.canonicalize(Oid)
,
GSSName.NT_EXPORT_NAME
public abstract GSSName createName(byte[] name, Oid nameType, Oid mech) throws GSSException
createName
然后也是GSSName.canonicalize
。
name
- 包含要创建的名称的字节数组
nameType
- Oid指定字节数组中提供的名称的命名空间。
null
可以用于指定每个检查字节数组的机制应该假定机制特定的默认语法。
mech
- Oid指定名称应该被规范化的机制
GSSException
-包含以下主要错误代码:
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.BAD_MECH
,
GSSException.FAILURE
GSSName.canonicalize(Oid)
,
GSSName.NT_EXPORT_NAME
public abstract GSSCredential createCredential(int usage) throws GSSException
GSS-API机制提供商必须对呼叫者强制执行本地访问控制策略,以防止未经授权的呼叫者获取他们无权的凭据。 不同机制提供者所需的种类可以在每个机制的基础上进行记录。 失败的权限检查可能会导致从此方法抛出SecurityException
。
usage
- 此凭证对象的预期用途。
此参数的值必须是一个: GSSCredential.INITIATE_AND_ACCEPT
, GSSCredential.ACCEPT_ONLY
和GSSCredential.INITIATE_ONLY
。
GSSException
-包含以下主要错误代码:
GSSException.BAD_MECH
,
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.CREDENTIALS_EXPIRED
,
GSSException.NO_CRED
,
GSSException.FAILURE
GSSCredential
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
。
GSSException
-包含以下主要错误代码:
GSSException.BAD_MECH
,
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.CREDENTIALS_EXPIRED
,
GSSException.NO_CRED
,
GSSException.FAILURE
GSSCredential
public abstract GSSCredential createCredential(GSSName name, int lifetime, Oid[] mechs, int usage) throws GSSException
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
。
GSSException
-包含以下主要错误代码:
GSSException.BAD_MECH
,
GSSException.BAD_NAMETYPE
,
GSSException.BAD_NAME
,
GSSException.CREDENTIALS_EXPIRED
,
GSSException.NO_CRED
,
GSSException.FAILURE
GSSCredential
public abstract GSSContext createContext(GSSName peer, Oid mech, GSSCredential myCred, int lifetime) throws GSSException
SecurityException
。
生命周期的非默认值不能始终被基础机制所尊重,因此应用程序应准备在返回的上下文中调用getLifetime
。
peer
- 目标对等体的名称。
mech
- 所需机制的Oid。
使用null
请求默认机制。
myCred
- 启动器的凭据。
使用null
充当默认启动器主体。
lifetime
- 为上下文lifetime
的生命周期(以秒为单位)。
使用GSSContext.INDEFINITE_LIFETIME
请求上下文具有最大允许的生命周期。
使用GSSContext.DEFAULT_LIFETIME
请求上下文的默认生命周期。
GSSException
- 包含以下主要错误代码:
GSSException.NO_CRED
GSSException.CREDENTIALS_EXPIRED
GSSException.BAD_NAMETYPE
GSSException.BAD_MECH
GSSException.FAILURE
GSSContext
public abstract GSSContext createContext(GSSCredential myCred) throws GSSException
SecurityException
。
myCred
- 接受者的凭据。
使用null
作为默认的接受者主体。
GSSException
- 包含以下主要错误代码:
GSSException.NO_CRED
GSSException.CREDENTIALS_EXPIRED
GSSException.BAD_MECH
GSSException.FAILURE
GSSContext
public abstract GSSContext createContext(byte[] interProcessToken) throws GSSException
实施不需要支持安全上下文的进程间传输。 在导出上下文之前,调用GSSContext.isTransferable
将指示上下文是否可转移。 在调用一个实现此方法不支持它会导致GSSException
错误代码GSSException.UNAVAILABLE
。 一些机制提供者可能要求呼叫者被授予启动或接受安全上下文的权限。 失败的权限检查可能会导致从该方法抛出SecurityException
。
interProcessToken
- 以前从导出方法发出的令牌。
GSSException
-包含以下主要错误代码:
GSSException.NO_CONTEXT
,
GSSException.DEFECTIVE_TOKEN
,
GSSException.UNAVAILABLE
,
GSSException.UNAUTHORIZED
,
GSSException.FAILURE
GSSContext
public abstract void addProviderAtFront(Provider p, Oid mech) throws GSSException
Oid
的Oid时,GSSManager必须在所有其他机构之前使用指定的提供程序,无论机制如何。
只有当指定的提供商不支持所需的机制时,GSSManager才会移动到不同的提供商。
调用此方法反复保留较旧的设置,但优先降低它们,从而形成提供者的有序列表和顶部增长的Oid
对。
使用null Oid
调用addProviderAtFront将删除在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
public abstract void addProviderAtEnd(Provider p, Oid mech) throws GSSException
调用此方法可重复保留较旧的设置,但优先级高于较新的设置,从而形成提供者和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