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.conf、jaas.conf和任何其他配置。