IBM Jdk Проблема Kerberos: не удается аутентифицировать таблицу ключей с credsType= оба в JAAS
У меня есть сервисная модель, в которой у меня есть таблица ключей для аутентификации Kerberos.
В этой модели я определил конфигурацию входа в систему следующим образом:
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
public class GSSIbmLoginConfiguration extends Configuration {
private AppConfigurationEntry configEntry;
public GSSIbmLoginConfiguration(String principal,
String credentialCache,
String keytab,
KerberosCredentialUsage usage) {
Map<String, String> params = new HashMap<String, String>();
params.put("credsType", "both");
params.put("renewable", Boolean.TRUE.toString());
params.put("principal", principal);
if (credentialCache != null) {
params.put("useCcache", credentialCache);
}
if (keytab != null) {
params.put("useKeytab", keytab);
}
configEntry = new AppConfigurationEntry(
"com.ibm.security.auth.module.Krb5LoginModule",
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, params);
}
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
return new AppConfigurationEntry[] {
configEntry
};
}
Эта конфигурация входа в систему заменяет jaas.conf
Сейчас я пытаюсь метод входа LoginContext, который работает. Я тогда получаю предмет от этого.
Теперь, используя эту тему, я делаю привилегированное действие.
private static final class SubjectAction implements PrivilegedExceptionAction<GSSCredential> {
private final int credentialType;
private final int credentialLifetime;
private SubjectAction(int credType, int lifetime) {
credentialType = credType;
credentialLifetime = lifetime;
}
public GSSCredential run() throws GSSException {
GSSManager gssManager = GSSManager.getInstance()
return gssManager.createCredential(null, credentialLifetime, KRB5_MECH_ID, GSSCredential.INITIATE_AND_ACCEPT);
}
}
Это не удается. Соответствующие журналы (которые я выкопал после настройки системных свойств журналов):-
[JGSS_DBG_CRED] localhost-startStop-1 Creating mech cred for null, mech 1.2.840.113554.1.2.2, usage initiate and accept
[JGSS_DBG_PROV] localhost-startStop-1 Provider Entry: provider: IBMJGSSProvider, mechanism: 1.3.6.1.5.5.2 get Factory for mech: 1.2.840.113554.1.2.2 GSSCaller:
[JGSS_DBG_PROV] localhost-startStop-1 Provider Entry: provider: IBMJGSSProvider, mechanism: 1.2.840.113554.1.2.2 get Factory for mech: 1.2.840.113554.1.2.2 GSSCaller:
[JGSS_DBG_PROV] localhost-startStop-1 Created new (empty) factory list (size=1) for provider IBMJGSSProvider version 7.0
[JGSS_DBG_PROV] localhost-startStop-1 Loading factory
[JGSS_DBG_PROV] localhost-startStop-1 Factory class name for provider IBMJGSSProvider version 7.0 is com.ibm.security.jgss.mech.krb5.Krb5MechFactory
[JGSS_DBG_PROV] localhost-startStop-1 Prior to load
[JGSS_DBG_PROV] localhost-startStop-1 Done to load
[JGSS_DBG_PROV] localhost-startStop-1 Loaded factory for provider IBMJGSSProvider version 7.0
[JGSS_DBG_PROV] localhost-startStop-1 Loaded factory ok
[JGSS_DBG_PROV] localhost-startStop-1 getFactory: index = 1 found factory caller = com.ibm.security.jgss.GSSCaller@e7d4b6d7
[JGSS_DBG_CRED] localhost-startStop-1 usage: initiate and subject
[JGSS_DBG_CRED] localhost-startStop-1 Obtaining creds from Krb5Util.ServiceCreds for default service
[JGSS_DBG_CRED] localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(1)
[JGSS_DBG_CRED] localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(23)
[JGSS_DBG_CRED] localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(3)
[JGSS_DBG_CRED] localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(17)
[JGSS_DBG_CRED] localhost-startStop-1 acquiring creds for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM
Что действительно удивляет, так это:
[JGSS_DBG_CRED] localhost-startStop-1 Creating mech cred for null, mech 1.2.840.113554.1.2.2, usage initiate and accept
and then:
[JGSS_DBG_PROV] localhost-startStop-1 getFactory: index = 1 found factory caller = com.ibm.security.jgss.GSSCaller@e7d4b6d7
[JGSS_DBG_CRED] localhost-startStop-1 usage: initiate and subject
Первая часть предназначена для самого createCredential. Однако второе, похоже, относится к вызову, связанному с фабрикой механизмов (в данном случае Kerberos). Теперь, после того, как этот файл основан на проверке подлинности кеша кредитов, начинается.
[KRB_DBG_CCHE] FileCredentialsCache:localhost-startStop-1: >>>KinitOptions cache name is /export/home/ispqa95/krb5cc_ispqa95
[KRB_DBG_CCHE] FileCredentialsCache:localhost-startStop-1: >>> FileCredentialsCache default name is: /export/home/ispqa95/krb5cc_ispqa95
[KRB_DBG_CCHE] FileCredentialsCache:localhost-startStop-1: >>>FileCredentialsCache: read ccache version 0x503
[KRB_DBG_KDC] KrbDataInputStream:localhost-startStop-1: >>>KrbDataInputStream: Bytes read: 0000: 49 4e 46 41 4b 52 42 2e 49 4e 46 41 44 45 56 2e INFAKRB.INFADEV.
0010: 43 4f 4d COM
[KRB_DBG_KDC] KrbDataInputStream:localhost-startStop-1: >>> CCacheInputStream: equiv string: INFAKRB.INFADEV.COM
[KRB_DBG_CCHE] CCacheInputStream:localhost-startStop-1: >>> readPrincipal: read realm INFAKRB.INFADEV.COM
[KRB_DBG_KDC] KrbDataInputStream:localhost-startStop-1: >>>KrbDataInputStream: Bytes read: 0000: 6e 61 67 61 72 6c 61 nagarla
Что означает, что фабрика механизмов приобретает неправильное значение.
Я пытался декомпилировать jar-файлы IBM (ibmjgssprovider.jar), но кажется, что имена классов внутри искажены (заменены на a,b, xy и т. Д.).
В конечном итоге это приводит к:- java.io.IOException: первичные принципалы не совпадают
Будучи проповедником, мне трудно понять поведение IBM. OpenJdk много помогает.
Может кто-нибудь помочь. Это какое-то системное свойство, которое устанавливает мой продукт, которое может вызвать такое поведение?
Я пытаюсь проверить все возможные системные свойства во время выполнения. Пожалуйста, дайте мне знать, если что-то еще нужно.
Также кто-то может указать на какой-нибудь форум по безопасности IBM JDK? Я хотел бы также опубликовать эту проблему там.
1 ответ
Хорошо, я понял, как решить эту проблему:-
Системное свойство:
-Djavax.security.auth.useSubjectCredsOnly=true
должен быть задан во время запуска, в противном случае учетные данные, используемые IBM, являются значениями по умолчанию (которые он пытается извлечь из кэша учетных данных на основе файлов в случае AIX)