と私は、この目的のために、私はKerberosチケットを検証することを選択した、Windowsドメインログインに基づいてSSOを使用したWeb appliactionを働いています。しかし、今私は解決策を見つけることができない問題に直面しています。私は、例外なしでチケットを検証するために管理し、私はユーザー名を取得しようとしている時にユーザ名がnull
あるので、NullPointerException
は、スローされ、問題がどこにあるか私にはわかりません。私は検証中に例外を取得しない場合GSSContextのはヌルSRCNAME
はなぜヌルのユーザー名ですか?私はこれに基づいて、私のクライアントを作成 String clientName = gssContext.getSrcName().toString();
:どのように私は、ユーザー名を取得
Using GSSManager to validate a Kerberos ticket
How to obtain a kerberos service ticket via GSS-API?
http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html
更新私も同じだ
このhttps://spring.io/blog/2009/09/28/spring-security-kerberos-spnego-extensionに基づいてIセットアップ春のセキュリティの場合:
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 by Subject.doAs(),
// so the service's credentials (Service Principal Name and password) are already
// available in the Subject
GSSCredential serviceCredentials = gssmgr.createCredential(serviceName,
GSSCredential.INDEFINITE_LIFETIME, spnegoOid, GSSCredential.ACCEPT_ONLY);
// create a security context for decrypting the service ticket
GSSContext gssContext = gssmgr.createContext(serviceCredentials);
// decrypt the service ticket
System.out.println("Entering accpetSecContext...");
System.out.println(new String (Base64.encodeBase64(gssContext.acceptSecContext(this.kerberosTicket, 0,
this.kerberosTicket.length))));
// get the client name from the decrypted service ticket
// note that Active Directory created the service ticket, so we can trust it
String clientName = gssContext.getSrcName().toString();
アップデート2:1:どのようにセットアップの内容は、ここだけのコピー&ペーストを形成https://stackoverflow.com/a/25450862/1646082
エラー:
java.lang.NullPointerException at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:136) at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:125) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422)
private static class KerberosValidateAction implements PrivilegedExceptionAction<String> {
byte[] kerberosTicket;
public KerberosValidateAction(byte[] kerberosTicket) {
this.kerberosTicket = kerberosTicket;
}
@Override
public String run() throws Exception {
GSSContext context = GSSManager.getInstance().createContext((GSSCredential) null);
context.acceptSecContext(kerberosTicket, 0, kerberosTicket.length);
String user = context.getSrcName().toString(); // ERROR!
context.dispose();
return user;
}
}
アップデート3:ここDomain authentication with Kerberos fails提案されているよう
も1.7から1.8からの変更Javaバージョンを試してみました。検索結果はありません。
更新4:すべての
まず。 Java 1.8 b40とb45を使用しないでください。両方とも壊れています。そして、ローカルPCでテストしないでください、それは動作しません(私はなぜわかりません)。
最新(B65)は、Javaのバージョンを上変更した後、私はencription(AP REPを復号化するための適切なタイプのキーを見つけることができません - AES256 ...)についての例外が発生しました。この私が、私は例外を得たすべてのこの後のJava 1.8のJava暗号化拡張機能(JCE)によって固定され、/crypto AES256-SHA1
と再作成キータブています
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 GssServer$GssServerAction.run(GssServer.java:159) ... 4 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 Source) at sun.security.krb5.EncryptedData.decrypt(Unknown Source) at sun.security.krb5.KrbApReq.authenticate(Unknown Source) at sun.security.krb5.KrbApReq.(Unknown Source) at sun.security.jgss.krb5.InitSecContextToken.(Unknown Source) ... 8 more Caused by: java.security.GeneralSecurityException: Checksum failed at sun.security.krb5.internal.crypto.dk.ArcFourCrypto.decrypt(Unknown Source) at sun.security.krb5.internal.crypto.ArcFourHmac.decrypt(Unknown Source) ... 14 more
「私はthis tutorialとkeytabfileを作成するための他の方法を試してみましたが、私はまだドン解決策があります。
してください、私はこれは古いスレッドです知っているが、私は最近、正確に同じ問題を持っていたし、私の場合、それはSPNとの問題だったあなたは、コンテキスト –
を確立するために使用するコードを示しています。 私は自分のサービスを呼び出し、cmdで 'klist'と入力して私のサービスを探しました。私はそれを見つけた後、私はこのような何かを見た:HTTP/[email protected]。このためのSPNが作成されていることを確認する必要があります。サービスアカウントを作成し、 'setspn -a HTTP/service.domain.com domain \ serviceAccout'でspnを作成した後、' ktab -k FILE:your_filename.ktab -a HTTP/service.domain.comドメインを持つキータブを作成します。 \ password_of_service_account'となります。 – Nico