![KrbException:无法创建凭据。 (63) - 没有服务信用](https://linux22.com/image/89279/KrbException%EF%BC%9A%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA%E5%87%AD%E6%8D%AE%E3%80%82%20(63)%20-%20%E6%B2%A1%E6%9C%89%E6%9C%8D%E5%8A%A1%E4%BF%A1%E7%94%A8.png)
我正在使用 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/[email protected]
我在 Tomcat 的本地主机日志中收到此错误:
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
当我跑步时
sudo -u tomcat8 klist
我得到了预期的回应:
root@linux-test2:/home/tbourne# sudo -u tomcat8 klist
Ticket cache: FILE:/tmp/krb5cc_111
Default principal: HTTP/[email protected]
Valid starting Expires Service principal
06/23/2016 14:33:10 06/24/2016 00:33:10 krbtgt/[email protected]
renew until 06/24/2016 14:33:07
当我在 Tomcat 启动期间捕获数据包时,我看到传递的服务/实例名称为krbtgt/OUR.DOMAIN.LOCAL
.我期望这是上面提到的默认主体。当我serverSpn
在数据库连接字符串中设置选项时,我得到了上述结果。
当我删除该serverSpn
选项时,它使用不同的主体名称。不幸的是,我无法使用该名称,因为每个 Tomcat 实例都需要唯一的登录名(因此也需要唯一的 SPN)。MSSQLSvc/[email protected]
我们的数据库连接字符串如下所示:
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/[email protected]"
我已经下载了 Microsoft JDBC 驱动程序版本 4.2 并且 Tomcat 正在使用它。
我不明白为什么 Tomcat 在向数据库进行身份验证时没有发送正确的主体名称。任何见解将不胜感激。
如果有帮助的话,我可以发布krb5.ini
Tomcat 的 、krb5.conf
、和任何其他配置。jaas.conf
答案1
Kerberos配置文件( /etc/krb5.conf
)区分大小写,将default_realm
名称更改为小写会导致这个问题。