|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.security.jgss.krb5; |
|
|
|
import javax.security.auth.kerberos.KerberosTicket; |
|
import javax.security.auth.kerberos.KerberosKey; |
|
import javax.security.auth.kerberos.KerberosPrincipal; |
|
import javax.security.auth.kerberos.KeyTab; |
|
import javax.security.auth.Subject; |
|
import javax.security.auth.login.LoginException; |
|
import java.security.AccessControlContext; |
|
import sun.security.jgss.GSSUtil; |
|
import sun.security.jgss.GSSCaller; |
|
|
|
import sun.security.krb5.Credentials; |
|
import sun.security.krb5.EncryptionKey; |
|
import sun.security.krb5.KrbException; |
|
import java.io.IOException; |
|
import java.util.ArrayList; |
|
import java.util.List; |
|
import sun.security.krb5.KerberosSecrets; |
|
import sun.security.krb5.PrincipalName; |
|
|
|
|
|
|
|
*/ |
|
public class Krb5Util { |
|
|
|
static final boolean DEBUG = |
|
java.security.AccessController.doPrivileged( |
|
new sun.security.action.GetBooleanAction |
|
("sun.security.krb5.debug")).booleanValue(); |
|
|
|
|
|
|
|
*/ |
|
private Krb5Util() { // Cannot create one of these |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static KerberosTicket getTicketFromSubjectAndTgs(GSSCaller caller, |
|
String clientPrincipal, String serverPrincipal, String tgsPrincipal, |
|
AccessControlContext acc) |
|
throws LoginException, KrbException, IOException { |
|
|
|
|
|
Subject accSubj = Subject.getSubject(acc); |
|
KerberosTicket ticket = SubjectComber.find(accSubj, |
|
serverPrincipal, clientPrincipal, KerberosTicket.class); |
|
|
|
if (ticket != null) { |
|
return ticket; |
|
} |
|
|
|
Subject loginSubj = null; |
|
if (!GSSUtil.useSubjectCredsOnly(caller)) { |
|
|
|
try { |
|
loginSubj = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID); |
|
ticket = SubjectComber.find(loginSubj, |
|
serverPrincipal, clientPrincipal, KerberosTicket.class); |
|
if (ticket != null) { |
|
return ticket; |
|
} |
|
} catch (LoginException e) { |
|
// No login entry to use |
|
// ignore and continue |
|
} |
|
} |
|
|
|
// Service ticket not found in subject or login |
|
// Try to get TGT to acquire service ticket |
|
|
|
|
|
KerberosTicket tgt = SubjectComber.find(accSubj, |
|
tgsPrincipal, clientPrincipal, KerberosTicket.class); |
|
|
|
boolean fromAcc; |
|
if (tgt == null && loginSubj != null) { |
|
|
|
tgt = SubjectComber.find(loginSubj, |
|
tgsPrincipal, clientPrincipal, KerberosTicket.class); |
|
fromAcc = false; |
|
} else { |
|
fromAcc = true; |
|
} |
|
|
|
|
|
if (tgt != null) { |
|
Credentials tgtCreds = ticketToCreds(tgt); |
|
Credentials serviceCreds = Credentials.acquireServiceCreds( |
|
serverPrincipal, tgtCreds); |
|
if (serviceCreds != null) { |
|
ticket = credsToTicket(serviceCreds); |
|
|
|
|
|
if (fromAcc && accSubj != null && !accSubj.isReadOnly()) { |
|
accSubj.getPrivateCredentials().add(ticket); |
|
} |
|
} |
|
} |
|
return ticket; |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
static KerberosTicket getServiceTicket(GSSCaller caller, |
|
String clientPrincipal, String serverPrincipal, |
|
AccessControlContext acc) throws LoginException { |
|
|
|
|
|
Subject accSubj = Subject.getSubject(acc); |
|
KerberosTicket ticket = |
|
SubjectComber.find(accSubj, serverPrincipal, clientPrincipal, |
|
KerberosTicket.class); |
|
|
|
return ticket; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
static KerberosTicket getInitialTicket(GSSCaller caller, |
|
String clientPrincipal, |
|
AccessControlContext acc) throws LoginException { |
|
|
|
|
|
Subject accSubj = Subject.getSubject(acc); |
|
KerberosTicket ticket = |
|
SubjectComber.find(accSubj, null, clientPrincipal, |
|
KerberosTicket.class); |
|
|
|
|
|
if (ticket == null && !GSSUtil.useSubjectCredsOnly(caller)) { |
|
Subject subject = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID); |
|
ticket = SubjectComber.find(subject, |
|
null, clientPrincipal, KerberosTicket.class); |
|
} |
|
return ticket; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static Subject getSubject(GSSCaller caller, |
|
AccessControlContext acc) throws LoginException { |
|
|
|
|
|
Subject subject = Subject.getSubject(acc); |
|
|
|
|
|
if (subject == null && !GSSUtil.useSubjectCredsOnly(caller)) { |
|
subject = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID); |
|
} |
|
return subject; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static ServiceCreds getServiceCreds(GSSCaller caller, |
|
String serverPrincipal, AccessControlContext acc) |
|
throws LoginException { |
|
|
|
Subject accSubj = Subject.getSubject(acc); |
|
ServiceCreds sc = null; |
|
if (accSubj != null) { |
|
sc = ServiceCreds.getInstance(accSubj, serverPrincipal); |
|
} |
|
if (sc == null && !GSSUtil.useSubjectCredsOnly(caller)) { |
|
Subject subject = GSSUtil.login(caller, GSSUtil.GSS_KRB5_MECH_OID); |
|
sc = ServiceCreds.getInstance(subject, serverPrincipal); |
|
} |
|
return sc; |
|
} |
|
|
|
public static KerberosTicket credsToTicket(Credentials serviceCreds) { |
|
EncryptionKey sessionKey = serviceCreds.getSessionKey(); |
|
KerberosTicket kt = new KerberosTicket( |
|
serviceCreds.getEncoded(), |
|
new KerberosPrincipal(serviceCreds.getClient().getName()), |
|
new KerberosPrincipal(serviceCreds.getServer().getName(), |
|
KerberosPrincipal.KRB_NT_SRV_INST), |
|
sessionKey.getBytes(), |
|
sessionKey.getEType(), |
|
serviceCreds.getFlags(), |
|
serviceCreds.getAuthTime(), |
|
serviceCreds.getStartTime(), |
|
serviceCreds.getEndTime(), |
|
serviceCreds.getRenewTill(), |
|
serviceCreds.getClientAddresses()); |
|
PrincipalName clientAlias = serviceCreds.getClientAlias(); |
|
PrincipalName serverAlias = serviceCreds.getServerAlias(); |
|
if (clientAlias != null) { |
|
KerberosSecrets.getJavaxSecurityAuthKerberosAccess() |
|
.kerberosTicketSetClientAlias(kt, new KerberosPrincipal( |
|
clientAlias.getName(), clientAlias.getNameType())); |
|
} |
|
if (serverAlias != null) { |
|
KerberosSecrets.getJavaxSecurityAuthKerberosAccess() |
|
.kerberosTicketSetServerAlias(kt, new KerberosPrincipal( |
|
serverAlias.getName(), serverAlias.getNameType())); |
|
} |
|
return kt; |
|
}; |
|
|
|
public static Credentials ticketToCreds(KerberosTicket kerbTicket) |
|
throws KrbException, IOException { |
|
KerberosPrincipal clientAlias = KerberosSecrets |
|
.getJavaxSecurityAuthKerberosAccess() |
|
.kerberosTicketGetClientAlias(kerbTicket); |
|
KerberosPrincipal serverAlias = KerberosSecrets |
|
.getJavaxSecurityAuthKerberosAccess() |
|
.kerberosTicketGetServerAlias(kerbTicket); |
|
return new Credentials( |
|
kerbTicket.getEncoded(), |
|
kerbTicket.getClient().getName(), |
|
(clientAlias != null ? clientAlias.getName() : null), |
|
kerbTicket.getServer().getName(), |
|
(serverAlias != null ? serverAlias.getName() : null), |
|
kerbTicket.getSessionKey().getEncoded(), |
|
kerbTicket.getSessionKeyType(), |
|
kerbTicket.getFlags(), |
|
kerbTicket.getAuthTime(), |
|
kerbTicket.getStartTime(), |
|
kerbTicket.getEndTime(), |
|
kerbTicket.getRenewTill(), |
|
kerbTicket.getClientAddresses()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static sun.security.krb5.internal.ktab.KeyTab |
|
snapshotFromJavaxKeyTab(KeyTab ktab) { |
|
return KerberosSecrets.getJavaxSecurityAuthKerberosAccess() |
|
.keyTabTakeSnapshot(ktab); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static EncryptionKey[] keysFromJavaxKeyTab( |
|
KeyTab ktab, PrincipalName cname) { |
|
return snapshotFromJavaxKeyTab(ktab).readServiceKeys(cname); |
|
} |
|
} |