0

KERBEROSとsharepoint2010を認証し、Apache CommonsHttpClient4.2を使用してHTTPRESTWebサービスを送信するlinux\java6クライアントがあります。

"kinit myuser@mydomain"クライアントを接続する前にコマンドラインから実行すると、スムーズに実行されます。

私の問題は、kinitを実行しないと、ユーザー名の入力を求められることです。

ユーザー名の入力を求められず、コマンドラインプログラムを実行せずにプログラムで認証するにはどうすればよいですか?

(私はlogin.confでキータブを作成して定義したので、パスワードプロンプトは処理されますが、ユーザーpromtは処理されません)

public static void main(String[] args) throws Exception {

    System.setProperty("java.security.auth.login.config", "login.conf");
    System.setProperty("java.security.krb5.conf", "krb5.conf");
    System.setProperty("sun.security.krb5.debug", "true");
    System.setProperty("javax.security.auth.useSubjectCredsOnly","false");

    DefaultHttpClient httpclient = new DefaultHttpClient();
    try {
        httpclient.getAuthSchemes().register(AuthPolicy.SPNEGO, new SPNegoSchemeFactory());

        Credentials use_jaas_creds = new Credentials() {

            public String getPassword() {
                return null;
            }

            public Principal getUserPrincipal() {
                return null;
            }

        };

        httpclient.getCredentialsProvider().setCredentials(
                new AuthScope(null, -1, null),
                use_jaas_creds);

        HttpUriRequest request = new HttpGet("http://kerberoshost/");
        HttpResponse response = httpclient.execute(request);
        HttpEntity entity = response.getEntity();

        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        System.out.println("----------------------------------------");
        if (entity != null) {
            System.out.println(EntityUtils.toString(entity));
        }
        System.out.println("----------------------------------------");

        // This ensures the connection gets released back to the manager
        EntityUtils.consume(entity);

    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
}
4

1 に答える 1

3

完全に透過的なクライアントKerberos認証(kinit)を取得するには、keytabファイルに加えてプリンシパル名を指定する必要があります。

 client {
   com.sun.security.auth.module.Krb5LoginModule required
     useKeyTab=true
     storeKey=true
     keyTab=/path/to/userKeytab
     principal="userName";
 };
于 2012-06-19T12:13:51.590 に答える