KrbException: 无法创建凭据。(63) - 没有服务信用

Tim*_*rne 6 linux kerberos sql tomcat

我正在使用 Oracle Java 1.8.0_91-b14(不是openjdk)在 Ubuntu 16.04 上设置 Tomcat 8.0.35,以便在对我们的 Microsoft SQL 数据库进行身份验证时使用 Kerberos 身份验证。我遇到的问题是,在kinit使用适当的开关以适当的用户身份运行后:

sudo -u tomcat8 kinit -k -t /etc/tomcat8/tomcat8.keytab HTTP/linux-test2.our.domain.local@OUR.DOMAIN.LOCAL
Run Code Online (Sandbox Code Playgroud)

我在 Tomcat 的 localhost 日志中收到此错误:

Caused by: GSSException: No valid credentials provided (Mechanism level: Fail to create credential. (63) - No service creds)
Caused by: KrbException: Fail to create credential. (63) - No service creds
Run Code Online (Sandbox Code Playgroud)

当我跑

sudo -u tomcat8 klist
Run Code Online (Sandbox Code Playgroud)

我得到了预期的回应:

root@linux-test2:/home/tbourne# sudo -u tomcat8 klist
Ticket cache: FILE:/tmp/krb5cc_111
Default principal: HTTP/linux-test2.our.domain.local@OUR.DOMAIN.LOCAL

Valid starting       Expires              Service principal
06/23/2016 14:33:10  06/24/2016 00:33:10  krbtgt/OUR.DOMAIN.LOCAL@OUR.DOMAIN.LOCAL
        renew until 06/24/2016 14:33:07
Run Code Online (Sandbox Code Playgroud)

当我在 Tomcat 启动期间捕获数据包时,我看到一个服务/实例名称被传递给krbtgt/OUR.DOMAIN.LOCAL. 我期待这是上面提到的默认主体。当我serverSpn在数据库连接字符串中设置该选项时,我得到了上述结果。

当我删除该serverSpn选项时,它使用不同的 Principal name MSSQLSvc/sql-server.our.domain.local@OUR.DOMAIN.LOCAL。不幸的是,我不能使用该名称,因为我需要为每个 Tomcat 实例提供唯一的登录名(以及唯一的 SPN)。

我们的数据库连接字符串如下所示:

property.db.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
property.db.jdbcUrl=jdbc:sqlserver://sql-server.our.domain.local:1434;databaseName=DBAUTH2;integratedSecurity=true;authenticationScheme=JavaKerberos;serverSpn="HTTP/linux-test2.our.domain.local@OUR.DOMAIN.LOCAL"
Run Code Online (Sandbox Code Playgroud)

我已经下载了 Microsoft JDBC 驱动程序 4.2 版,Tomcat 正在使用它。

我不知道为什么 Tomcat 在对数据库进行身份验证时没有发送正确的主体名称。任何见解将不胜感激。

如果它们有帮助krb5.ini,我可以发布Tomcat、krb5.confjaas.conf和任何其他配置。

小智 1

Kerberos 配置文件 ( /etc/krb5.conf) 区分大小写,将default_realm名称更改为小写会导致此问题