2009-06-11 3 views
5

우리 회사에서 kerberos 도메인이 있고 Java/Kerberos examples을 실행 중입니다. 내가 가진 질문은 서버의 관점에서 로그인 메커니즘에 관한 것입니다. 서버 예제 인 GssServer.java을 실행할 때 javax.security.auth.Subject을 얻어야합니다. 제공된 코드에서이 따라서 LoginContext 경유 :kerberos from Java - 현재 인증 된 사용자의 제목 가져 오기

// Create a LoginContext with a callback handler and login 
LoginContext context = new LoginContext(name, new TextCallbackHandler()); 
context.login(); 

Subject subject = context.getSubject(); 

이 모두 OK 내가이 예를 실행할 때 나는 사랑스러운 로그인 프롬프트를 참조하십시오. 그러나 내 문제는 이것이 이 아니며이 아니라 내 서버가 어떻게 돌아가는지 그리고 어떻게 kerberos 도메인에서 서비스를 제공해야 하는지를 이해하게되었습니다. GssServer 예에서 문제는 내 서버 (읽기 : 서비스) 은 클라이언트에 서비스를 제공하기 위해에서 KDC으로 인증 할 필요가 없습니다. 이를 수행하려면 서버 측 keytab 파일에 액세스해야합니다. 예제 설정에 대한 그래서 :

//jaas-krb5.conf 
server { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useKeyTab=true 
    storeKey=true 
    keyTab="/home/myusr/my-server.keytab" 
    principal="myserv/mymachine.some.domain"; 
}; 

그리고 자바 코드에

:

GSSManager manager = GSSManager.getInstance(); 
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); 
GSSName gssName = manager.createName("myserv/[email protected]", 
            GSSName.NT_HOSTBASED_SERVICE); 
GSSCredential serverCreds = manager.createCredential(gssName, 
            GSSCredential.DEFAULT_LIFETIME, 
            krb5Mechanism, 
            GSSCredential.ACCEPT_ONLY); 

이 가진 문제는 jaas-krb5.conf 파일의 server 정보가 나는 통해 자신을 인증 하지 않으면 사용할 수없는 것입니다 줄 :

Jaas.loginAndAction("server", action);  

나는이 인증을 거치지 않아도됩니다. 하지만 자신을 인증하지 않으면 다음과 같이 끝납니다.

Exception in thread "main" GSSException: No valid credentials provided (Mechanism level: Attempt to obtain new ACCEPT credentials failed!) 
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:188) 
    at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:73) 
    at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:77) 
    at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:149) 
    at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:389) 
    at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:45) 
    at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:102) 
    at gsa.hk.GssServer$GssServerAction.run(GssServer.java:79) 
    at gsa.hk.GssServer.main(GssServer.java:57) 
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.sun.security.jgss.accept 
    at javax.security.auth.login.LoginContext.init(LoginContext.java:256) 
    at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403) 
    at sun.security.jgss.LoginUtility.login(LoginUtility.java:72) 
    at sun.security.jgss.krb5.Krb5Util.getKeysFromSubject(Krb5Util.java:205) 
    at sun.security.jgss.krb5.Krb5AcceptCredential$1.run(Krb5AcceptCredential.java:184) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:181) 
    ... 8 more 

문제가 있다는 것은 놀라운 일이 아닙니다. 결국 server 주제에 대한 핸들이 없으면 내 keytab의 위치 또는 제공하는 서비스를 어떻게 알 수 있습니까?

내 질문은 : 코드에서 자신을 인증하지 않고 keytab/서비스를 어떻게 알 수 있습니까?

답변

5

확인. 따라서 매우 쉽게 알 수 있다고 가정하면 인증 대신 keytab 파일을 사용할 수 있다는 것을 알고 있다고 가정합니다.

//jaas-krb5.conf 
anything { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useKeyTab=true 
    storeKey=true 
    doNotPrompt=true 
    keyTab="/home/myusr/my-server.keytab" 
    principal="myserv/mymachine.some.domain"; 
}; 

중요한 비트가 doNotPrompt=true의 추가이다 : 나는

loginAndAction("anything", action) 

그럼 내 설정이 같아야 경우는, 기본적으로 JavaDoc for Krb5LoginModule

에서 조금 설명되어 있습니다. 이 속성이 설정되면 서버 코드는 키탭의 정보를 사용합니다

관련 문제