Tag: kerberos

Java GSS-API服务票证未使用Java保存在凭据高速缓存中

我使用GSS-API创建了2个演示Kerberos客户端。 一个在Python3中,第二个在Java中。 两个客户端似乎大致相同,并且两者都“起作用”,因为我获得了我的Java GSS-API服务主体接受的服务票证。 但是在测试时我注意到Python客户端将服务票据保存在kerberos凭证缓存中,而Java客户端似乎没有保存票证。 我使用“klist”来查看凭证缓存的内容。 我的客户使用FreeIPA作为Kerberos环境在Lubuntu 17.04虚拟机上运行。 我正在使用OpenJDK 8 u131。 问题1: Java GSS-API是否不保存凭证缓存的服务票证? 或者我可以更改我的代码吗? 问题2:服务票据是否未保存到缓存这一事实是否有任何缺点? 我的假设是缓存的服务票据减少了与KDC的交互,但评论了如何使用Windows Java客户端保存Kerberos服务票证? 建议事实并非如此,但是这个Microsoft技术说明“每次想要访问这个特定服务器时,客户端都不需要返回KDC”。 问题3:来自python客户端的缓存服务票证在几分钟后消失 – 在到期日之前很久。 是什么导致他们消失? Python代码 #!/usr/bin/python3.5 import gssapi from io import BytesIO server_name = ‘HTTP/app-srv.acme.com@ACME.COM’ service_name = gssapi.Name(server_name) client_ctx = gssapi.SecurityContext(name=service_name, usage=’initiate’) initial_client_token = client_ctx.step() Java代码 System.setProperty(“java.security.krb5.conf”,”/etc/krb5.conf”); System.setProperty(“javax.security.auth.useSubjectCredsOnly”,”false”); GSSManager manager = GSSManager.getInstance(); GSSName clientName; GSSContext context […]

Java SSO:针对Active Directory的Kerberos身份validation

我仍在尝试为SSO(在* nix上运行)找到基于Java的解决方案,我可以在JBoss上使用它来针对Active Directory /域控制器进行授权。 我最初尝试通过NTLM执行此操作,但放弃了因为它在Windows Server> = 2008上不受支持。 因此,我正在尝试使用Kerberos实现此function,但似乎无法找到正确/可行的解决方案。 请指出正确的方向,说明如何设置这样的配置,如何validationActive Directory和/或域控制器,以便: 找出该帐户是否有效 获取用户的组列表 任何帮助表示赞赏! UPDATE 我正在使用jcifs-ext-0.9.4和jcifs-krb5-1.3.12开发解决方案。 我按如下所述设置了web.xml: auth jcifs.http.AuthenticationFilter java.security.auth.login.config /WEB-INF/login.conf jcifs.spnego.servicePrincipal HTTP/testconn@mydomain.com jcifs.spnego.servicePassword supersecret sun.security.krb5.debug true java.security.krb5.realm mydomain.com java.security.krb5.kdc testdom01.mydomain.com jcifs.smb.client.domain TESTDOMAIN jcifs.http.enableNegotiate true jcifs.http.basicRealm mydomain.com jcifs.http.domainController testdom01.mydomain.com auth /* 如果尝试访问应用程序,这会导致以下堆栈跟踪: 2010-07-22 15:53:10,588 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/google].[default]] Servlet.service() for servlet default threw exception java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native […]

Kerberos – 使用HMAC无法找到适当类型的密钥来解密AP REP-RC4

我正在尝试使用Kerberos / SpNego为Java WebApp设置SSO。 我在用着: Java 1.7u67 org.springframework.security.kerberos 1.0.0.RELEASE 活动目录 Linux上的Tomcat 7 克服了如何在Tomcat / linux服务器上配置kerberos中描述的问题? ,我现在坚持以下错误: org.springframework.security.authentication.BadCredentialsException: Kerberos validation not succesful at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:70) ~[spring-security-kerberos-core-1.0.0.RELEASE.jar:1.0.0.RELEASE] at org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:64) ~[spring-security-kerberos-core-1.0.0.RELEASE.jar:1.0.0.RELEASE] at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) ~[spring-security-core-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145) ~[spring-security-kerberos-web-1.0.0.RELEASE.jar:1.0.0.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] at […]

Kerberos错误:GSSHeader找不到正确的标记

我正在尝试将Kerberos身份validation连接到SOAP服务wsdl url。 我能够成功建立连接并进行服务呼叫。 启动服务器后,我能够至少进行一次成功的服务呼叫。 但是在几次请求(1次或更多次)之后,我突然收到无效的令牌错误。 一旦我收到错误,未来的调用就不起作用,错误仍然存​​在。 如果我重新启动服务器,那么服务调用至少会工作一次。 以上循环继续。 我无法弄清楚为什么突然令牌失效,尽管它早先工作。 并且重新启动服务器使令牌再次有效 。 这是错误堆栈跟踪: Caused by: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag) at sun.security.jgss.GSSHeader.(GSSHeader.java:97) at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:237) at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)

使用Kerberos S4U扩展(在Java 8中引入)使用JDBC连接到数据库

我用Java编写代码已经有一段时间了,所以我可能会遗漏一些明显的东西。 我想通过JDBC连接到数据库(我需要支持很多 – SQL Server,MySQL等)。 但是,我想使用Java 8中添加的Microsoft S4U Java扩展支持来实现Kerberos委派。 我不希望用户必须在我的中间层服务器上输入他们的凭据。 我想使用S4U代表用户获取我的中间层服务器的票证,并使用它通过doAs函数(Subject.doAs或doAsPrivileged)调用JDBC代码。 我已经在Windows上使用C ++和ODBC添加了对协议转换和约束委派的支持。 但我不知道如何用Java做同样的事情。 关于Java的S4U文档很稀疏。 此页面似乎包含最多信息 – http://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/jgss-features.html 。 该页面说“已经在com.sun.security.jgss包中添加了一个新的公共方法(GSSCredential :: impersonate)来实现这些扩展。” 基于http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html ,我认为我需要使用类LoginContext和Subject来调用doAs JDBC连接调用,以便在Subject的凭据下进行连接。 但是我如何在混合中使用GSSCredential :: impersonate? 谢谢,艾德

如何在WebSphere上为远程EJB调用启用Kerberos身份validation?

由于经典的JNDI查找和RMI-IIOP方法调用,我的应用程序是一个独立的Swing客户端调用EJB无状态会话bean。 它作为Java WebStart应用程序启动。 我的目标是使用getCallerPrincipal方法从EJBContext检索客户端用户的身份,这要归功于Windows工作站,ActiveDirectory和Linux上运行的WebSphere服务器之间的Kerberos SSO。 由于信息中心文档,我已经在网络部署模式下成功配置了我的WebSphere单元以支持Kerberos身份validation。 krb5.conf和krb5.keytab文件都可以使用Linux kinit , klist和wsadmin进行测试, $AdminTask validateKrbConfig回答为true 。 客户端设置仅引用JAAS login.config文件以使用命令系统属性启用。 我的直觉告诉我这可能还不够。 但现在,我找不到更多信息来完成测试用例: 如何设置JNDI初始上下文环境以触发Kerberos协商? 如果在服务器端有其他要求,比如用角色保护我的EJB(例如JBoss不需要它)? 更新 由于没有使用./launchClient运行JavaEE客户端容器,我在JNLP中设置了读取sas.client.props和JAAS登录配置所需的属性: 我的wsjaas_client.config适用于Oracle Java,因此它包含: WSKRB5Login{ com.sun.security.auth.module.Krb5LoginModule required debug=true useTicketCache=true doNotPrompt=true; }; 我的sas.client.props包含: com.ibm.CORBA.securityEnabled=true com.ibm.CORBA.authenticationTarget=KRB5 com.ibm.CORBA.loginSource=krb5Ccache com.ibm.CORBA.loginUserid= com.ibm.CORBA.loginPassword= com.ibm.CORBA.krb5CcacheFile= com.ibm.CORBA.krb5ConfigFile=C:\\temp\\krb5.conf 目前,没有触发Kerberos身份validation:我的kerberos缓存(来自Windows或Linux工作站)中的SPN WAS/myserver.mydomain.com没有TGS,并且仍然匿名建立JNDI连接。 没有错误信息,没有警告,最后没有校长。 我如何诊断错误或缺乏? 更新2012/06/20 这是向前迈出的一步。 在我的应用程序JNLP中运行Oracle Java,我已设置以下属性以使用IBM ORB并启用完整的跟踪和调试信息: TraceSettings.properties文件包含 traceFileName=c:\\temp\\traces.log ORBRas=all=enabled SASRas=all=enabled com.ibm.*=all=enabled 即使在阅读了大量的WebSphere 7 Security […]

如何通过GSS-API获取kerberos服务票?

有谁知道如何使用Java GSS-API从密钥分发中心(KDC)获取服务票证? 我有一个胖客户端应用程序,首先通过JAAS使用Krb5LoginModule从票证缓存中获取TGT进行身份validation(后台:Windows例如使用kerberos实现并将票证授予票证存储在安全的内存区域)。 从LoginManager我得到包含TGT的Subject对象。 现在我希望当我为我的服务创建一个特定的GSSCredential对象时,服务票证也将被放入Subject的私人凭证中(我已经在网上的某处读过)。 所以我尝试了以下方法: // Exception handling ommitted LoginContext lc = new LoginContext(“HelloEjbClient”, new DialogCallbackHandler()); lc.login() Subject.doAs(lc.getSubject(), new PrivilegedAction() { public Object run() { GSSManager manager = GSSManager.getInstance(); GSSName clientName = manager.createName(“clientUser”, GSSName.NT_USER_NAME); GSSCredential clientCreds = manager.createCredential(clientName, 8 * 3600, createKerberosOid(), GSSCredential.INITIATE_ONLY); GSSName serverName = manager.createName(“myService@localhost”, GSSName.NT_HOSTBASED_SERVICE); manager.createCredential(serverName, GSSCredential.INDEFINITE_LIFETIME, createKerberosOid(), GSSCredential.INITIATE_ONLY); return null; […]

在没有SPnego的情况下访问kerberos可以保护WebHDFS

我有一个使用WebHDFS管理HDFS的工作应用程序。 我需要能够在Kerberos安全集群上执行此操作。 问题是,没有库或扩展来协商我的应用程序的票证,我只有一个基本的HTTP客户端。 是否可以创建一个可以处理票证交换的Java服务,并且一旦获得服务票证就可以将其传递给应用程序以便在HTTP请求中使用? 换句话说,我的应用程序会要求Java服务协商票证,它会将服务票证以字符串或原始字符串forms返回给我的应用程序,应用程序只会将其附加到HTTP请求中吗? 编辑:是否有类似优雅的解决方案,如@SamsonScharfrichter描述的HTTPfs? (据我所知,它不支持委托令牌) EDIT2:大家好,我还是完全迷失了。 我试图弄清楚Hadoop-auth客户端没有任何运气。 你能再帮我一次吗? 我已经花了几个小时阅读它而没有运气。 这些例子说这样做: * // establishing an initial connection * * URL url = new URL(“http://foo:8080/bar”); * AuthenticatedURL.Token token = new AuthenticatedURL.Token(); * AuthenticatedURL aUrl = new AuthenticatedURL(); * HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection(); * …. * // use the ‘conn’ instance * …. 我已经失去了。 […]

具有null SrcName的GSSContext

我正在使用基于Windows域登录的SSO进行Web应用程序,为此我选择validationKerberos票证。 但是现在我遇到了一个我无法找到解决方案的问题。 我设法validation没有exception的票证,但是当我试图获取userName时,抛出NullPointerException ,因为用户名为null ,我不知道问题出在哪里。 如果在validation期间没有出现任何exception,为什么用户名为null? 我如何得到userName: String clientName = gssContext.getSrcName().toString(); 我基于此创建了我的客户端: 使用GSSManagervalidationKerberos票证 如何通过GSS-API获取kerberos服务票? http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html 更新1: 我如何设置内容,只需复制粘贴表格https://stackoverflow.com/a/25450862/1646082 : final Oid spnegoOid = new Oid(“1.3.6.1.5.5.2”); GSSManager gssmgr = GSSManager.getInstance(); // tell the GSSManager the Kerberos name of the service GSSName serviceName = gssmgr.createName(this.servicePrincipal, GSSName.NT_USER_NAME); // get the service’s credentials. note that this run() method was called […]

JAAS – 无法将Kerberos票证持久化到缓存文件,无法从头开始创建缓存…以及其他详细信息

我正在开发一个使用JAAS执行身份validation的Java应用程序,应该按如下方式工作:(i)当用户uclient的票证已经在本地缓存中时,它应该在不询问凭证的情况下对用户进行身份validation,(ii)当没有“uclient”的票证时’在缓存中它应该询问用户名/密码并将获取的票证保存到本地缓存中。 我的应用程序能够执行’i’但无法执行’ii’,它正确地validation用户(创建主题/主体),但它不会将Krb票证持久存储到缓存中。 问题 我如何实现/实现这一目标? 并且..这是否会在空/不存在时创建Kerberos缓存文件? – 如何从Java中以编程方式实现缓存文件创建/初始化? 而且……仅仅是为了好奇,Java JaaS是否能够管理linux KEYRING? (目前Jaas无法自动管理它们) Java JaaS是否只能管理/持久化缓存中的默认主体的票证? – 或者我如何管理JaaS,我在单个缓存文件中有很多主体的票? 请注意,我的应用程序必须在Windows AD和Linux Realms中运行。 关于我的环境和我当前代码的更多数据 我正在使用FreeIPA客户端和服务器配置的Linux Kerberos Realm中测试客户端应用程序。 我有一个Linux VM,它为领域AUTHDEMO.IT提供KDC,以及一个支持AUTHDEMO.IT领域的Linux VM。 krb5.conf配置: includedir /var/lib/sss/pubconf/krb5.include.d/ [libdefaults] default_realm = AUTHDEMO.IT dns_lookup_realm = true dns_lookup_kdc = true rdns = false ticket_lifetime = 24h forwardable = true udp_preference_limit = 0 default_ccache_name = KEYRING:persistent:%{uid} [realms] AUTHDEMO.IT […]