要在Windows上使用Java进行客户端HTTP SPNEGO身份验证,您需要设置Windows注册表项allowtgtsessionkey.这是有据可查的.我不明白的是人们如何解决这个问题?为了单个软件,大多数企业站点永远不会接受在Windows中更改此注册表项.如果需要在组织中的每个工作站上更改它,请考虑一下麻烦.但这只是理论,因为我到目前为止还无法说服我们的任何客户更改此注册表项.
我不怪他们.大多数企业管理员会认为这样可以放松安全性并因此反对它.
我已经读过: 在Java或命令行工具中是否有办法使用本机SSPI API获取服务的Kerberos票证?
但它现在已经很老了.
所以我真的,真的不明白人们如何使Windows + Java客户端+ Kerberos可以在除大学环境,家庭用户等之外的任何地方工作.
我从公司管理员那里得到的问题是"当IE和Firefox等应用程序在没有设置此密钥的情况下执行SPNEGO时没有问题时,我们为什么需要设置此注册表项?".好吧,我知道答案是什么.这是因为(很可能)IE和Firefox等应用程序基于Windows本机GSS API(SSPI),而Sun的Java使用自己的实现.
我假设使用像WAFFLE这样的东西可以解决问题,但我赞成纯Java解决方案.我还假设使用基于Java的解决方案(如Spring安全性或Apache HttpClient)无济于事,因为它们都会遇到这个问题.
任何帮助或指针将不胜感激.
更新1:
我发现Oracle的bug数据库中有一个RFE.还有一个由Oracle员工就此问题提交的补丁以及有关此功能的JDK邮件列表的讨论.除了我能理解的这一点在目前的Java 7中是不可用的,甚至不是实验性的,都不会让我更加明智.对?
更新2:
现在问题在OpenJDK Security Dev邮件列表上再次存在.
我正在使用spnego(http://spnego.sourceforge.net)在JBoss下进行kerberos身份验证.
我需要解密kerberos票证才能访问包含PAC数据的授权数据.需要PAC数据来决定将哪些角色授予用户.
如何访问和解密kerberos票?我在网上搜索了一些例子,但没有努力.
我有一个使用spring-security kerberos扩展的工作应用程序,在jboss上运行,运行java 6.
我正在将我的jvm从java 6升级到java 7.当我这样做时,使用相同的代码库和在java 6上工作的相同keytab,我现在在使用java 7时收到错误.
我一直收到:java.security.PrivilegedActionException:GSSException:在GSS-API级别未指定失败(机制级别:无效参数(400) - 无法找到适当类型的密钥以使用HMAC解密AP REP-RC4)
我试图用其他论坛中描述的不同/加密选项重新生成密钥表,但无济于事.
我已经调试了java 7代码,实际上,处理启动时读取keytab的类从6更改为7.可能是因为我的keytab不再正确读入应用程序了吗?我在启动时使用Java6看到的一些调试消息在7中不再出现了,但我不知道这是设计还是表明其他内容正在发挥作用?有没有其他人有问题从6升级到7并且他们的kerberos集成打破了他们?有什么建议?
使用spnego和kerberos调试登录进行启动,我的日志显示:
2012-12-10 10:29:30,886 Debug is true storeKey true useTicketCache false useKeyTab true doNotPrompt true ticketCache is null isInitiator false KeyTab is jndi:/localhost/docfinity/WEB-INF/classes/config/common/security/http-docfinity.keytab refreshKrb5Config is false principal is HTTP/VMMSSDEV.TESTING.LOCAL@TESTING.LOCAL tryFirstPass is false useFirstPass is false storePass is false clearPass is false
2012-12-10 10:30:26,322 principal is HTTP/VMMSSDEV.TESTING.LOCAL@TESTING.LOCAL
2012-12-10 10:30:29,794 Will use keytab
2012-12-10 10:30:29,807 Ordering keys wrt default_tkt_enctypes list
2012-12-10 10:30:29,821 Config name: C:\Windows\krb5.ini
2012-12-10 10:30:29,827 Using …
Run Code Online (Sandbox Code Playgroud) 如何HttpClient
使用登录用户的ActiveDirectory
凭据正确设置连接以对网站进行身份验证并要求Kerberos/Spnego authentication
?
是否有一个apache模块实现了Tomcat使用的Kerberos身份验证,并且还支持Kerberos委派?
我已经看过了mod_spnego,它抛弃了它创建的SSPI上下文,只保留了主体名称.相反,我正在寻找一个模块,允许委托发送给Tomcat的票证 - 也就是说,将服务票据发送给身份验证并使用服务器端代表用户访问另一个服务.
编辑:为了澄清,我需要使用GSS/SSPI上下文在Win32下模拟,因此当旧代码连接到另一台服务器时,将使用委派的凭据.
我有一个Java客户端应用程序和一个Java服务器应用程序,我正在尝试通过Kerberos对服务器进行身份验证.客户端基本上使用http组件和SPNEGO进行HTTP GET调用,但我总是得到401 Unauthorized
结果.
我无法在下面的Kerberos登录序列中发现错误,也许你们可以:
Debug is true storeKey false useTicketCache false useKeyTab false doNotPrompt f
alse ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is fa
lse principal is null tryFirstPass is false useFirstPass is false storePass is f
alse clearPass is false
Kerberos-Benutzername [GP_Myuser]: GP_Myuser@EESERV.LOCAL
Kerberos-Passwort f³r GP_Myuser@EESERV.LOCAL:
[Krb5LoginModule] user entered username: GP_Myuser@EESERV.
LOCAL
default etypes for default_tkt_enctypes: 23.
Acquire TGT using AS Exchange
default etypes for default_tkt_enctypes: 23.
>>> KrbAsReq calling createMessage
>>> KrbAsReq in …
Run Code Online (Sandbox Code Playgroud) 我们无法使用Kerberos/AD身份验证来使用Spring Web应用程序,我认为该问题与Kerberos票证和Active Directory域功能级别的加密类型有关.
基本设置是:
我有一个环境,其中Active Directory域功能级别是Windows Server 2003,一切正常,如果客户端登录到域,则客户端按预期进行身份验证.使用kerbtray检查此环境中的票证我可以看到它们都具有票证加密类型和密钥加密类型"RSADSI RC4-HMAC".
我有一个功能级别为Windows Server 2008的新域,这是身份验证不起作用的地方.尝试验证票证时返回的应用程序错误是:
Kerberos validation not successful...
Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(Unknown Source)
at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:146)
at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:136)
... 34 more
Caused by: KrbException: Checksum failed
at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source)
at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将应用程序从使用java7u51更改为java8u40,但SSO身份验证失败.客户端没有更改,它使用JNA Windows调用(Secur32.INSTANCE.InitializeSecurityContext
)但服务器不再接受票证.服务器代码没有改变,但它使用的标准java库似乎已经改变了.服务器在linux下运行.
服务器代码如下.在我的Windows机器上,我写了一个包含票证的文件,以便我可以运行下面的代码进行测试.我有一个非常高的clockkew设置,以便我可以测试票.我已经使用java7u51编写了客户票,以防万一,但没有帮助.当我在java7中运行以下服务器代码时,相同的票可以正常工作.
失败的位是isEstablished
返回false.没有有用的调试信息.isEstablished
返回false意味着需要更多轮次,但并非如此,我认为不应该如此.
有谁知道这个现在会在java8中失败的原因?这不仅仅是更新40的问题,它在早期的Java 8版本中失败了.
谢谢
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 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个简单的单点登录方案,其中一些参与的服务器将是Windows(IIS)框.看起来SPNEGO是一条合理的道路.
这是场景:
听起来不错吗?
我需要两件事(至少我现在能想到的):
我正在尝试使用Jetty嵌入式服务器来公开我的Rest API,现在我想实现Kerberos身份验证.这就是我创建SecurityHandler的方式
String domainRealm = "MY.COM";
Constraint constraint = new Constraint();
constraint.setName(Constraint.__SPNEGO_AUTH);
constraint.setRoles(new String[]{domainRealm});
constraint.setAuthenticate(true);
ConstraintMapping cm = new ConstraintMapping();
cm.setConstraint(constraint);
cm.setPathSpec("/*");
SpnegoLoginService loginService = new SpnegoLoginService();
loginService.setConfig("/path/to/spnego.properties");
loginService.setName(domainRealm);
ConstraintSecurityHandler sh = new ConstraintSecurityHandler();
sh.setAuthenticator(new SpnegoAuthenticator());
sh.setLoginService(loginService);
sh.setConstraintMappings(new ConstraintMapping[]{cm});
sh.setRealmName(domainRealm);
Run Code Online (Sandbox Code Playgroud)
这是我的spnego.properties:
targetName = HTTP/target.name.com
Run Code Online (Sandbox Code Playgroud)
我的krb5.ini:
[libdefaults]
default_realm = HW.COM
default_keytab_name = FILE:/path/to/target.name.com.keytab
permitted_enctypes = aes128-cts aes256-cts arcfour-hmac-md5
default_tgs_enctypes = aes128-cts aes256-cts arcfour-hmac-md5
default_tkt_enctypes = aes128-cts aes256-cts arcfour-hmac-md5
[realms]
MY.COM= {
kdc = 12.13.14.222 #IP adress
admin_server = 12.13.14.222 # IP …
Run Code Online (Sandbox Code Playgroud)