gssjava_JAVAGSSAPI实现主要类介绍
阅读:
383
包org.ietf.jgss介绍
该JAVA Package提供了⼀个标准的框架,允许应⽤程序开发⼈员使⽤统⼀的API从各种底层安全机制(如Kerberos)中利⽤安全服务,如⾝份验证,数据完整性和数据机密性。应⽤程序可以通过唯⼀的对象标识符标识(object identifier)来选择使⽤的安全机制,如Kerberos v5 GSS-API机制的对象标识符为1.2.840.113554.1.2.2。此机制可通过GSSManager类的默认实例获得。应⽤程序通过实例化GSSManager,然后GSSManager作为Security Context 安全上下⽂的⼯⼚类。应⽤程序可以使⽤GSSManager创建安全上下⽂,然后通过Security Conetext上下⽂建⽴循环来建⽴发送端与接收端的共享上下⽂,然后就可以从该上下⽂获得诸如数据完整性和机密性的数据保护。
注意:GSS-API不与参与通信的发送端和接收端执⾏任何通信,它负责⽣成令牌,应⽤程序必须以某种⽅式传输令牌到相应的⼀⽅来建⽴共享的Security Context。
下⾯是主要的JGSS的接⼝和类:
GSSManager
GSSManager类是其他重要GSS-API类的⼯⼚类,还提供有关所⽀持安全机制的信息。它可以创建实现以下三个GSS-API接⼝的类的实例:GSSName,GSSCredential和GSSContext。通过GSSManager,可以查询可⽤;
通过静态⽅法getInstance获取默认GSSManager⼦类的实例,应⽤程序可以实例化GSSManager的其他⼦类。默认的GSSManager实例⽀持Kerberos v5 GSS-API机制。该机制的Oid为“1.2.840.113554.1.2.2”,在RFC 1964中定义。
该类常见的重要⽅法如下:
下⾯⼀段⽰例演⽰了如何使⽤GSSManager的常见⽤法:
GSSManager manager = Instance();
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 = ateName(“duke”, GSSName.NT_USER_NAME);
// Identify the name of the server. This uses a Kerberos specific
// name format.
GSSName serverName = ateName(“nfs/foo.sun”,
krb5PrincipalNameType);
// Acquire credentials for the user
GSSCredential userCreds = ateCredential(userName,
GSSCredential.DEFAULT_LIFETIME,
krb5Mechanism,
GSSCredential.INITIATE_ONLY);
/
/ Instantiate and initialize a security context that will be
// established with the server
GSSContext context = ateContext(serverName,
krb5Mechanism,
userCreds,
GSSContext.DEFAULT_LIFETIME);
GSSContext
此接⼝封装GSS-API安全上下⽂(Security Context),并提供上下⽂中可⽤的安全服务。GSS-API以独⽴于底层传输协议的⽅式运⾏,依赖于应⽤程序来传输由发送端和接收端的安全上下⽂⽣成的令牌。如果调⽤者使⽤默认的GSSManager实例化上下⽂,则Kerberos v5 GSS-API机制可⽤于上下⽂建⽴。该机制由Oid“1.2.840.113554.1.2.2”标识。
通常情况下,Security Context建⽴发⽣在⼀个循环中,其中发送端调⽤initSecContext,接收端调⽤a
cceptSecContext直到建⽴上下⽂。在此循环中,initSecContext和acceptSecContext⽅法⽣成应⽤程序发送给对等⽅的安全令牌。根据具体情况,对等体将此类令牌作为输⼊传递给acceptSecContext或initSecContext⽅法;
当不再需要上下⽂时,应⽤程序应调⽤dispose以释放上下⽂可能正在使⽤的任何系统资源。
该类常见的重要⽅法如下:
下⾯⼀段⽰例演⽰了如何使⽤GSSContext的常见⽤法:
// Create a context using default credentials
// and the implementation specific default mechanism
GSSManager manager …
GSSName targetName …
GSSContext context = ateContext(targetName, null, null,
GSSContext.INDEFINITE_LIFETIME);
// set desired context options prior to context establishment
// establish a context between peers
byte []inToken = new byte[0];
// Loop while there still is a token to be processed
while (!context.isEstablished()) {
byte[] outToken
= context.initSecContext(inToken, 0, inToken.length);
// send the output token if generated
if (outToken != null)
sendToken(outToken);
if (!context.isEstablished()) {
inToken = readToken();
}
// display context information
System.out.println(“Remaining lifetime in seconds = “
+ Lifetime());
System.out.println(“Context mechanism = ” + Mech());
System.out.println(“Initiator = ” + SrcName());
System.out.println(“Acceptor = ” + TargName());
if (ConfState())
System.out.println(“Confidentiality (i.e., privacy) is available”);
if (IntegState())
System.out.println(“Integrity is available”);
// perform wrap on an application supplied message, appMsg,
// using QOP = 0, and requesting privacy service
byte [] appMsg …
MessageProp mProp = new MessageProp(0, true);
byte []tok = context.wrap(appMsg, 0, appMsg.length, mProp);
sendToken(tok);
// release the local-end of the context
context.dispose();
GSSName类
该接⼝封装了单个GSSAPI的主体实体,应⽤程序通过GSSManager类中存在的createName⽅法来创建该实例。下⾯给出该类⽀持的GSSName类型:
下⾯⼀段⽰例演⽰了如何使⽤GSSContext的常见⽤法:
GSSManager manager = Instance();
// create a host based service name
GSSName name = ateName(“service@host”,
GSSName.NT_HOSTBASED_SERVICE);
Oid krb5 = new Oid(“1.2.840.113554.1.2.2”);
GSSName mechName = name.canonicalize(krb5);
// the above two steps are equivalent to the following
GSSName mechName = ateName(“service@host”,
GSSName.NT_HOSTBASED_SERVICE, krb5);
// perform name comparison
if (name.equals(mechName))
print(“Names are equals.”);
// obtain textual representation of name and its printable
// name type
String() +
/
/ export and re-import the name
byte [] exportName = port();
java上下文context// create a new name object from the exported buffer
GSSName newName = ateName(exportName,
GSSName.NT_EXPORT_NAME);
GSSCredential
该接⼝封装实体主体的GSSAPI安全凭证,凭证包含必要的加密信息以便所对应的实体能够创建安全上下⽂。根据不同的底层安全机制,该安全凭证可能包含不同的凭证元素,每个元素包含特定安全机制的信息。
应⽤程序根据所传递的参数来创建凭证对象,应⽤程序也可以获取有关凭证对象的特定信息。当不再需要凭证时,应⽤程序应调⽤dispose ⽅法以释放凭证对象所持有的任何资源并销毁任何加密的敏感信息。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。