Spring Boot + Ldap / AD + Kerberos SSO:KrbCryptoException - 校验和失败

2024-01-06

我正在尝试使用 Spring Boot、Ldap 和 kerberos 来实现 SSO。对于不同的加密类型,我遇到了多个 Checksum failed 错误。

环境详情:-

机器:Windows 10

JDK版本:Oracle 1.8.0_144(64位)

我似乎陷入了一个死胡同,无法找到任何解决方案。

这是我运行时遇到的错误

Added key: 17version: 5
Added key: 18version: 5
Added key: 23version: 5
Found unsupported keytype (3) for HTTP/[email protected] /cdn-cgi/l/email-protection
Found unsupported keytype (1) for HTTP/[email protected] /cdn-cgi/l/email-protection
>>> EType: sun.security.krb5.internal.crypto.Aes128CtsHmacSha1EType
2019-08-30 11:26:10.746  WARN 6640 --- [p-bio-80-exec-9] w.a.SpnegoAuthenticationProcessingFilter : Negotiate Header was invalid: Negotiate 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

org.springframework.security.authentication.BadCredentialsException: Kerberos validation not successful
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:71) ~[spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
    at org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:64) ~[spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174) ~[spring-security-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) ~[spring-security-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:494) ~[spring-security-config-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145) ~[spring-security-kerberos-web-1.0.1.RELEASE.jar:1.0.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) [spring-security-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) [spring-security-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]

Caused by: java.security.PrivilegedActionException: null
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_144]
    at javax.security.auth.Subject.doAs(Subject.java:422) ~[na:1.8.0_144]
    at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:68)

Caused by: org.ietf.jgss.GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
    at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:856) ~[na:1.8.0_144]
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342) ~[na:1.8.0_144]
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) ~[na:1.8.0_144]
    at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:906) ~[na:1.8.0_144]
    at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:556) ~[na:1.8.0_144]
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342) ~[na:1.8.0_144]
    at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) ~[na:1.8.0_144]

Caused by: sun.security.krb5.KrbCryptoException: Checksum failed
    at sun.security.krb5.internal.crypto.Aes128CtsHmacSha1EType.decrypt(Aes128CtsHmacSha1EType.java:102) ~[na:1.8.0_144]
    at sun.security.krb5.internal.crypto.Aes128CtsHmacSha1EType.decrypt(Aes128CtsHmacSha1EType.java:94) ~[na:1.8.0_144]
    at sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:175) ~[na:1.8.0_144]
    at sun.security.krb5.KrbApReq.authenticate(KrbApReq.java:281) ~[na:1.8.0_144]
    at sun.security.krb5.KrbApReq.<init>(KrbApReq.java:149) ~[na:1.8.0_144]
    at sun.security.jgss.krb5.InitSecContextToken.<init>(InitSecContextToken.java:108)

Caused by: java.security.GeneralSecurityException: Checksum failed
    at sun.security.krb5.internal.crypto.dk.AesDkCrypto.decryptCTS(AesDkCrypto.java:451) ~[na:1.8.0_144]

我从 Windows 服务器生成的 Keytab 文件,其中可以通过此命令使用 AD -

ktpass /out test.keytab /mapuser [email protected] /cdn-cgi/l/email-protection /princ HTTP/[email protected] /cdn-cgi/l/email-protection /pass password /ptype KRB5_NT_PRINCIPAL /crypto All

Set SPN对于同一用户,通过

Setspn –A HTTP/[email protected] /cdn-cgi/l/email-protection ldap-read

Check keytab通过命令文件

ktab -l -e -t -k "C:\Install\test.keytab"

这是结果

Keytab name: C:\Install\test.keytab
KVNO Timestamp      Principal
---- -------------- ---------------------------------------------------------------------
   5 1/1/70 5:30 AM http/[email protected] /cdn-cgi/l/email-protection (1:DES CBC mode with CRC-32)
   5 1/1/70 5:30 AM http/[email protected] /cdn-cgi/l/email-protection (3:DES CBC mode with MD5)
   5 1/1/70 5:30 AM http/[email protected] /cdn-cgi/l/email-protection (23:RC4 with HMAC)
   5 1/1/70 5:30 AM http/[email protected] /cdn-cgi/l/email-protection (18:AES256 CTS mode with HMAC SHA1-96)
   5 1/1/70 5:30 AM http/[email protected] /cdn-cgi/l/email-protection (17:AES128 CTS mode with HMAC SHA1-96)

还更新了安全选项的客户端和服务器设置,并标记了允许加密类型的检查

这是安全配置java文件

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


@Value("${ldap.url}")
private String ldapUrl;
@Value("${ldap.manager.dn}")
private String ldapManagerDn;
@Value("${ldap.manager.password}")
private String ldapManagerPassword;
@Value("${ldap.user.searchbase}")
private String ldapUserSearchBase;
@Value("${app.service-principal}")
private String servicePrincipal;

@Autowired
private StaffService userService;
@Autowired
CustomAuthenticationProvider customAuthProvider;


@Override
protected void configure(HttpSecurity http) throws Exception {

http.csrf().disable().exceptionHandling().authenticationEntryPoint(spnegoEntryPoint())
    .and().authorizeRequests()
    .antMatchers("/signup","/logout").permitAll()
    .antMatchers("/","/login","/index","/index/**","/projects","/projects/**","/project")
        .fullyAuthenticated()
    .and()
    .formLogin().loginPage("/login")
    .defaultSuccessUrl("/index")
    .and()
    .logout().permitAll()
    .and().headers()
      .frameOptions()
         .sameOrigin()
    .and()
    .addFilterBefore(
    spnegoAuthenticationProcessingFilter(authenticationManagerBean()),
    BasicAuthenticationFilter.class);

}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception{

    auth.
    authenticationProvider(kerberosAuthenticationProvider())
    .authenticationProvider(kerberosServiceAuthenticationProvider());
}

    @Bean
    public KerberosAuthenticationProvider kerberosAuthenticationProvider() {
        KerberosAuthenticationProvider provider =
                new KerberosAuthenticationProvider();
        SunJaasKerberosClient client = new SunJaasKerberosClient();
        client.setDebug(true);
        provider.setKerberosClient(client);
        provider.setUserDetailsService(userService);
        return provider;
    }

     @Bean
    public SpnegoEntryPoint spnegoEntryPoint() {
        return new SpnegoEntryPoint("/login");
    }

@Bean
public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter(
        AuthenticationManager authenticationManager) {
    SpnegoAuthenticationProcessingFilter filter =
            new SpnegoAuthenticationProcessingFilter();
    try {
        filter.setAuthenticationManager(authenticationManagerBean());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return filter;
}

    @Bean
    public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() {
        KerberosServiceAuthenticationProvider provider =
                new KerberosServiceAuthenticationProvider();
        provider.setTicketValidator(sunJaasKerberosTicketValidator());
        provider.setUserDetailsService(userService);
        return provider;
    }

    @Bean
    public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() {
        SunJaasKerberosTicketValidator ticketValidator =
                new SunJaasKerberosTicketValidator();
        ticketValidator.setServicePrincipal(servicePrincipal);
        FileSystemResource fs = new FileSystemResource("C:/install/test.keytab");
        ticketValidator.setKeyTabLocation(fs);
        ticketValidator.setDebug(true);
        return ticketValidator;
    }

    @Bean
    public LdapTemplate ldapTemplate() throws Exception{
        LdapTemplate ldapTemplate = new LdapTemplate();
        ldapTemplate.setIgnorePartialResultException(true);
        ldapTemplate.setContextSource(kerberosLdapContextSource());
        return ldapTemplate;
    }

    @Bean
    public KerberosLdapContextSource kerberosLdapContextSource() {
        KerberosLdapContextSource contextSource = new KerberosLdapContextSource(ldapUrl);
        contextSource.setBase(ldapUserSearchBase);
        contextSource.setUserDn(ldapManagerDn);
        contextSource.setPassword(ldapManagerPassword);
        SunJaasKrb5LoginConfig loginConfig = new SunJaasKrb5LoginConfig();
        FileSystemResource fs = new FileSystemResource("C:/install/test.keytab");
        loginConfig.setKeyTabLocation(fs);
        loginConfig.setServicePrincipal(servicePrincipal);
        loginConfig.setDebug(true);
        loginConfig.setUseTicketCache(true);
        loginConfig.setIsInitiator(true);
        contextSource.setLoginConfig(loginConfig);
        return contextSource;
    }

    @Bean
    public LdapUserDetailsService ldapUserDetailsService() {
        FilterBasedLdapUserSearch userSearch =
                new FilterBasedLdapUserSearch(ldapUserSearchBase, ldapUserSearchFilter, kerberosLdapContextSource());
        LdapUserDetailsService service = new LdapUserDetailsService(userSearch);
        CustomLdapUserDetailsMapper customLdapUserDetailsMapper = new CustomLdapUserDetailsMapper();
        service.setUserDetailsMapper(customLdapUserDetailsMapper);
        return service;
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {        
        return new BCryptPasswordEncoder();
    }

    @Bean
    public RestTemplate restTemplate() {
        FileSystemResource fs = new FileSystemResource("C:/install/test.keytab");
        return new KerberosRestTemplate(fs.getPath(),servicePrincipal);
    }
}

以下是本篇内容krb5.ini文件位于C:\Windows在 Windows 10 机器中:-

[libdefaults]
  forwardable = true
  dns_lookup_kdc = true
  dns_lookup_realm = true
  default_realm = BAUER.DE
  default_keytab_name = "C:\Install\test.keytab"

  default_tkt_enctypes = rc4-hmac aes256-cts aes128-cts des3-cbc-sha1 des-cbc-md5 des-cbc-crc
  default_tgs_enctypes = rc4-hmac aes256-cts aes128-cts des3-cbc-sha1 des-cbc-md5 des-cbc-crc
  permitted_enctypes   = rc4-hmac aes256-cts aes128-cts des3-cbc-sha1 des-cbc-md5 des-cbc-crc

[realms]
  EXAMPLE.COM = {
     kdc = host.test
  }

[domain_realm]
  .host.test = EXAMPLE.COM
  host.test  = EXAMPLE.COM

我还更新了JCE jar文件位于 C:\Program Files\Java\jre1.8.0_191\lib\security 和 C:\Program Files\Java\jdk1.8.0_144\jre\lib\security 文件夹下。

应该做什么来克服这个异常? 是否有任何 Java 代码需要更新或任何 kerberos 配置需要更改。有人有什么想法吗?

更新1:

校验和问题仍然存在。但是,当我使用 kinit 命令检查 JAVA JDK 中的 keytab 文件时,我看到了一个新问题,

我从 JDK 1.8 bin 目录中的服务器执行了以下命令

kinit -k -t "C:\Install\test.keytab" HTTP/[email protected] /cdn-cgi/l/email-protection

并收到 ICMP 端口不可达错误

java.net.PortUnreachableException: ICMP Port Unreachable
        at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
        at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:124)
        at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)
        at java.net.DatagramSocket.receive(DatagramSocket.java:812)
        at sun.security.krb5.internal.UDPClient.receive(NetClient.java:206)
        at sun.security.krb5.KdcComm$KdcCommunication.run(KdcComm.java:411)
        at sun.security.krb5.KdcComm$KdcCommunication.run(KdcComm.java:364)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.security.krb5.KdcComm.send(KdcComm.java:348)
        at sun.security.krb5.KdcComm.sendIfPossible(KdcComm.java:253)
        at sun.security.krb5.KdcComm.send(KdcComm.java:229)
        at sun.security.krb5.KdcComm.send(KdcComm.java:200)

请检查这些(这是我其他答案的副本here https://stackoverflow.com/questions/56573623/how-to-pass-windows-authenticationbrowser-from-react-application-to-spnego-ker) :

  1. 用户登录操作系统上的域帐户。
  2. 在浏览器中进行正确的配置,请参阅Spring文档 https://docs.spring.io/spring-security-kerberos/docs/1.0.2.BUILD-SNAPSHOT/reference/htmlsingle/

例如。对于 Internet Explorer:

E.3 互联网浏览器

完成以下步骤以确保您的 Internet Explorer 浏览器 启用以执行 Spnego 身份验证。

Open Internet Explorer.
Click Tools > Intenet Options > Security tab.
In Local intranet section make sure your server is trusted by i.e. adding it into a list.

然后您应该检查您的 Authorization HTTP 标头值的样子并将其粘贴到此处,因为它不在问题描述中。最好的选择是实现日志过滤器(例如基于这个答案 https://stackoverflow.com/a/43155103/4374701)。该过滤器必须添加在 spnegoAuthenticationProcessingFilter 之前,例如:

.addFilterBefore(serverRequestLoggingFilter(), WebAsyncManagerIntegrationFilter.class)

in your SecurityConfig.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot + Ldap / AD + Kerberos SSO:KrbCryptoException - 校验和失败 的相关文章

随机推荐

  • Youtube API,gapi没有定义?

    我正在尝试做一个 Youtube API 我觉得除了这个gapi和res之外我一切都正常 它说gapi未定义 我怎样才能做到这一点 function tplawesome e t res e for var n 0 n
  • 从具有“路径中的非法字符”的位置执行 CMD.EXE 中的 Powershell 脚本

    我试图在 cmd exe 中调用 Powershell 脚本 该脚本位于如下位置 c Data foo bar location 1 ShellScript ps1 当我调用这个脚本时 我尝试在路径周围使用单引号和双引号 但没有成功 Pow
  • 从时间轴中提取 Google 位置历史记录

    请注意 由于 Google 的 时间轴 发生了变化之前的答案不再有效 https stackoverflow com questions 18290525 wget your google location history daily 谷歌
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • 如何在 Kotlin 中使用 ViewModel 测试协程?

    我无法测试我的方法 感觉它没有到达 uiScope launch 块内部 并且我已经发布了我正在尝试测试的 viewModel 方法 并且fetchActivationCodeWithDuration是挂起功能 底部是我的测试类 我收到这条
  • Unix 系统中的文件 read() 函数

    下面的代码重新启动read 如果由于信号中断而导致功能失败 这read 从中断处继续读取 因此 如果read 在阅读之前被中断EOF字符 它会返回什么 读取了多少字节 int r read int fd void buf int size
  • 在范围内分组选择

    From Table A B 1 A 3 B 6 C 7 C 8 X 9 Y 15 Z 16 R 17 t 23 T 43 e 如何带来这个结果 Range A Count B 1 10 6 11 20 3 21 30 1 31 40 1
  • 不允许用户停止 javascriptalert()

    我正在开发 MVC 4 Web 应用程序 我使用 javascript 和 jquery 来做很多事情 但对于这样的信息 我使用alert 函数向用户显示各种消息 问题是 用户可以阻止此警报的出现 如果用户这样做 很多重要的消息和信息将不会
  • 在 WinForms 应用程序中编译 ASPX

    我正在编写一个发送电子邮件消息 如邮件合并 的 WinForms 应用程序 我想使用 ASP Net 的渲染引擎来渲染消息的 HTML 正文 在没有整个 ASP Net 运行时的情况下获取单个 ASPX 页面的渲染输出的最简单方法是什么 为
  • 加载 fxml 作为后台进程 - Javafx

    我最初的 fxml 比如说home fxml 有很多功能 因此需要很多时间才能完全加载 因此 为了避免程序启动和 fxml 加载之间的时间间隔 我又引入了一个 fxml 例如loader fxml 带有 gif 图像 该图像应在加载主 fx
  • 打印预览中不显示背景颜色

    我正在尝试打印一页 在该页面中 我为表格指定了背景颜色 当我在 Chrome 中查看打印预览时 它没有采用背景颜色属性 所以我尝试了这个属性 webkit print color adjust exact 但仍然没有显示颜色 http js
  • MySQL:返回更新的行

    我正在尝试将这两个查询组合在扭曲的Python中 SELECT FROM table WHERE group id 1013 and time gt 100 and UPDATE table SET time 0 WHERE group i
  • 在 Angular 2 中测试服务时,NgModule“DynamicTestModule”的提供程序无效

    我有以下服务 import Injectable from angular core import MenuItem from classes menu item import ITEMS from static data items li
  • javax.validation.ConstraintDefinitionException:HV000074

    我尝试在特定字段上使用 javax hibernate 自定义验证 但出现以下错误 javax validation ConstraintDefinitionException HV000074 com hertz digital hert
  • 提取 Excel 中前 10% 的列值并放入另一列中

    我有一个 Excel 电子表格 其中一列中包含值 我需要的是一个 VBA 代码 它将识别前 10 的列值 并将它们放置在相邻列中 为什么不忽略 VBA 并使用百分位数函数创建 true false 列并对其进行过滤 例如 B2 中的值是否位
  • CSS3 变换比例和容器并溢出

    我正在尝试使用 CSS3 Transform 缩放 为容器创建放大功能 并且一切似乎都运行良好 但是当缩放图像时 溢出仅覆盖图像的一部分 而将左上角部分排除在外溢出 代码如下 HTML div class outer img src htt
  • 具有相同选项的多个选择框 - 需要唯一的选择

    我有一个带有 3 个选择框的表单 每个选择框都有相同的选项 我想要求您必须为每个选择框选择不同的选项 例如 假设选项是 猫 狗 和 鸟 如果有人在第一个选择框中选择 鸟 我想从其他两个框中禁用或隐藏该选项 如果他们更改选择 则 鸟 将再次启
  • 完全使用本机代码(无 JNI)从后台线程更新 UI?

    我正在编写一个 Android 应用程序 它在后台线程中执行大量处理 计算是使用 C 在本机代码中执行的 我想在计算过程中使用部分结果更新 UI 我可以通过 JNI 来做到这一点 即在 java 中设置对 UI 对象的引用 然后通过 JNI
  • 如何在 cli 中使用 ejs lint

    我使用 EJS 作为节点上的视图引擎并进行快速设置 我想使用 ejs lint 来帮助获取错误行 我以前没有使用过 linter 但是通过阅读这里的文档 https github com RyanZim EJS Lint https git
  • Spring Boot + Ldap / AD + Kerberos SSO:KrbCryptoException - 校验和失败

    我正在尝试使用 Spring Boot Ldap 和 kerberos 来实现 SSO 对于不同的加密类型 我遇到了多个 Checksum failed 错误 环境详情 机器 Windows 10 JDK版本 Oracle 1 8 0 14