我试图将应用程序从使用java7u51更改为使用java8u40,但SSO身份验证失败。客户端没有改变,它使用JNA windows调用(secur32.instance.initializeSecurityContext
),但是服务器不再接受票据。服务器代码没有改变,但它使用的是标准java库,这些库似乎已经改变了。服务器运行在Linux下。
服务器代码如下所示。在windows计算机上,我编写了一个包含票证的文件,以便运行下面的代码进行测试。我有一个非常高的时钟倾斜设置,这样我就可以对着票进行测试。以防万一,我使用java7u51编写了客户机票证,但这并没有帮助。当我在Java7中运行下面的服务器代码时,同样的票证可以正常工作。
失败的位是issesterated
返回false。没有有用的调试信息。isseleted
返回false意味着需要更多轮,但以前不是这样,我认为不应该是这样。
Properties.setProp("sun.security.krb5.debug", "true")
Properties.setProp("java.security.krb5.realm", "xxxx")
Properties.setProp("java.security.krb5.kdc", "xxxx")
Properties.setProp("java.security.krb5.conf", url(getClass, "/krb5.conf.auth").toExternalForm)
Properties.setProp("java.security.auth.login.config", url(getClass, "/jaas.conf.auth").toExternalForm)
Properties.setProp("javax.security.auth.useSubjectCredsOnly", "true")
val loginCtx: LoginContext = new LoginContext("Server", new LoginCallbackHandler(password))
loginCtx.login()
val subject = loginCtx.getSubject
val ticket = StringIO.readStringFromFile(new File("/tmp/ticket"))
val decoder: BASE64Decoder = new BASE64Decoder
val serviceTicket = decoder.decodeBuffer(ticket)
val user = Subject.doAs(subject, new PrivilegedAction[Option[String]]() {
def run = {
try {
val manager = GSSManager.getInstance
val context: GSSContext = manager.createContext(null: GSSCredential)
val arrayOfBytes = context.acceptSecContext(serviceTicket, 0, serviceTicket.length)
// we ignore arrayOfBytes
assert(context.isEstablished, "Failed to establish context: " + context)
val username = context.getSrcName.toString
Some(username)
} catch {
case e: Exception =>
println("failed: " + e.getMessage)
None
}
}
})
krb5.conf.auth
[libdefaults]
default_realm = XXX
allow_weak_crypto=true
default_tkt_enctypes = rc4-hmac des-cbc-md5 des-cbc-crc des3-cbc-sha1
default_tgs_enctypes = rc4-hmac des-cbc-md5 des-cbc-crc des3-cbc-sha1
permitted_enctypes = rc4-hmac des-cbc-md5 des-cbc-crc des3-cbc-sha1
default_checksum = rsa-md5
kdc_timesync = 0
kdc_default_options = 0x40000010
clockskew = 30000
check_delegate = 0
ccache_type = 3
kdc_timeout = 60000
forwardable = true
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
#excluding realms and domain_realm
jaas.conf.auth (server section)
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=false
debug=true
isInitiator=false
storeKey=true
useTicketCache=false
principal="XXX";
};
更新2:这不是真正的答案,但如果我改变windows客户端创建票证的方式,它就会工作。因此,如果您不创建SPNEGO包装的票证,而是创建Kerberos专用票证,那么Java8将接受它。因此,将下面的“协商”改为“Kerberos”可以解决这个问题。
Secur32.INSTANCE.AcquireCredentialsHandle(
servicePrincipalName,
"Negotiate", // Change to "Kerberos"
new NativeLong(Sspi.SECPKG_CRED_OUTBOUND),
null,
authIdentity.getPointer,
null,
null,
phClientCredential,
ptsClientExpiry)
Kerberos/SPNEGO是一个浪费域。
根据我的想法,下面是一个快速检查列表,希望对此有任何帮助。
>
你需要256位加密吗?可以看到键入(键类型18=AES-256):
问题内容: 我有一个Java Web应用程序,可以在Windows Active Directory环境中对客户端进行SPNEGO身份验证。为了验证用户身份,我们使用了旧的SPNEGO SourceForge项目中的代码。 身份验证效果很好,但是我们还需要使用受约束的委派将用户凭据委派给后端服务(Exchange EWS)。在我们的广告中进行配置时,看起来差别很小,但不是。请参阅: AD委托设置
问题内容: 我正在使用spnego(http://spnego.sourceforge.net)在JBoss下进行kerberos身份验证。 我需要解密kerberos票证才能访问包含PAC数据的授权数据。需要PAC数据来决定要授予用户哪些角色。 如何访问和解密kerberos票?我在网上搜索了示例,但没有任何努力。 问题答案: 这些家伙具有完整的PAC解码实现: http://jaasloung
spnego/kerberos身份验证出现以下错误 运行hellokeytab.java文件时出现此错误。 安装程序、链接和我用于SPNEGO/Kerberos身份验证的文件。 链接-http://spnego.sourceforge.net/ tomcat服务器的域帐户 用户-xyztest 密码-**** 主体-princ http/appserver1@corp.xyz.com 1)hell
任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权
我正在尝试使用Kerberos在Tomcat9(使用SDK8)中配置SSO。我的环境都在Windows Server 2016 VMS中:- null null 在tomcat服务器中,我创建了文件。/tomcat-9/conf/krb5.ini 我创建了文件。/tomcat-9/conf/jass.conf 到目前为止,在我找到的所有教程中,它都是相当一致的。从现在开始,far west和我对t
我已经安装了 krb5-应用程序-服务器和 krb5-工作站;在 KDC 服务器中的 /etc/krb5.conf 中配置 krb5.conf 我在 KDC 中创建了一个用户根/管理员 但是当我在应用程序服务器上时,键入 : 他们说: “在初始化 kadmin 接口时,kadmin 客户端缺少 krb5.conf 中缺少的参数” krb5.conf 中缺少什么???在 krb5.conf 中应用: