2009-06-11 17 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であると私は例を実行すると、私は素敵なログインプロンプトを参照してください。しかし、私の問題は、これはではなく、は本当に私のサーバーがどのように動いているのか、どのように私がケルベロスのドメイン内からサービスを提示するべきかを理解するように導かれました。 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"; 
}; 

とJavaコード内:

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がどこにあるか、または私が提供しているサービスはどこで知ることができますか?

私の質問はです。にコードで自分自身を認証せずにキータブ/サービスについて教えてもらえますか?

答えて

5

OK。したがって、と非常に簡単です。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

のビットを概説します。このプロパティを設定すると、サーバーコードはキータブの情報を使用します

関連する問題