我正在使用 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
名稱改為小寫會導致這個問題。