Tôi đang làm việc một ứng dụng web với SSO dựa trên đăng nhập tên miền Windows, cho mục đích này tôi đã chọn để xác nhận vé Kerberos. Nhưng bây giờ tôi đang đối mặt với một vấn đề mà tôi không thể tìm thấy một giải pháp. Tôi quản lý để xác nhận một vé mà không có ngoại lệ, nhưng khi tôi đang cố gắng để có được userName, NullPointerException
được ném, bởi vì tên người dùng là null
và tôi không biết vấn đề ở đâu.GSSContext with null SrcName
Tại sao tên người dùng lại trống nếu tôi không nhận được bất kỳ ngoại lệ nào trong quá trình xác thực?
Làm thế nào tôi có được userName: String clientName = gssContext.getSrcName().toString();
tôi tạo khách hàng của tôi dựa trên này:
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
Cập nhật 1:
Làm thế nào tôi thiết lập nội dung, chỉ cần sao chép-dán mẫu ở đây 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 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();
Cập nhật 2:
Nếu tôi an ninh thiết lập mùa xuân dựa trên https://spring.io/blog/2009/09/28/spring-security-kerberos-spnego-extension này tôi cũng đã giống nhau lỗi:
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;
}
}
Cập nhật 3:
Cũng đã cố gắng thay đổi phiên bản Java 1,8-1,7 như đề xuất ở đây Domain authentication with Kerberos fails. Không kết quả.
Cập nhật 4:
Trước hết. Không sử dụng Java 1.8 b40 và b45, cả hai đều bị hỏng. Và không kiểm tra nó trên máy tính địa phương, nó không hoạt động (tôi không biết tại sao).
Sau khi thay đổi phiên bản Java mới nhất (b65), tôi có ngoại lệ về việc đăng ký (Không thể tìm thấy khóa thích hợp để giải mã AP REP - AES256 ...). Này, tôi đã cố định bởi Java Cryptography Extension (JCE) cho Java 1.8 và tái tạo keytab với /crypto AES256-SHA1
sau khi tất cả điều này tôi đã nhận ngoại lệ:
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
tôi đã cố gắng this tutorial và cách nào khác để tạo keytabfile, nhưng tôi vẫn don' t có giải pháp.
Xin vui lòng, hiển thị mã bạn sử dụng để thiết lập bối cảnh –
Tôi biết đây là một chủ đề cũ nhưng gần đây tôi đã có vấn đề chính xác cùng và trong trường hợp của tôi đó là một vấn đề với các spn. Tôi đã gọi dịch vụ của mình và sau đó nhập 'klist' vào cmd để tìm kiếm dịch vụ của tôi. sau khi tôi tìm thấy nó, tôi thấy một cái gì đó như thế này: HTTP/[email protected] Những gì bạn phải làm là xác minh rằng một SPN cho điều này được tạo ra. Tạo một tài khoản dịch vụ và tạo spn với 'setspn -a HTTP/service.domain.com domain \ serviceAccout' và sau đó tạo một keytab với' ktab -k FILE: your_filename.ktab -a miền HTTP/service.domain.com \ password_of_service_account'. – Nico