前言
整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。
開源專案
從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。
系列文章
web server apache tomcat11-01-官方文件入門介紹
web server apache tomcat11-02-setup 啟動
web server apache tomcat11-03-deploy 如何部署
web server apache tomcat11-04-manager 如何管理?
web server apache tomcat11-06-Host Manager App -- Text Interface
web server apache tomcat11-07-Realm Configuration
web server apache tomcat11-08-JNDI Resources
web server apache tomcat11-09-JNDI Datasource
web server apache tomcat11-10-Class Loader
web server apache tomcat11-11-Jasper 2 JSP Engine
web server apache tomcat11-12-SSL/TLS Configuration
web server apache tomcat11-13-SSI
web server apache tomcat11-14-CGI
web server apache tomcat11-15-proxy
web server apache tomcat11-16-mbean
web server apache tomcat11-17-default-servlet
web server apache tomcat11-18-clusting 叢集
web server apache tomcat11-19-load balance 負載均衡
web server apache tomcat11-20-connectors 聯結器
web server apache tomcat11-21-monitor and management 監控與管理
web server apache tomcat11-22-logging 日誌
web server apache tomcat11-23-APR
web server apache tomcat11-24-Virtual Hosting and Tomcat
web server apache tomcat11-25-Advanced IO and Tomcat
web server apache tomcat11-26-maven jars
web server apache tomcat11-27-Security Considerations
web server apache tomcat11-28-Windows Service
web server apache tomcat11-29-Windows Authentication
web server apache tomcat11-30-The Tomcat JDBC Connection Pool
web server apache tomcat11-31-websocket
web server apache tomcat11-32-rewrite
web server apache tomcat11-33-CDI
web server apache tomcat11-34-Ahead of Time compilation support
概述
整合的Windows身份驗證通常在內部網路環境中使用,因為它要求執行身份驗證的伺服器和被驗證的使用者屬於同一個域。為了讓使用者自動認證,使用者使用的客戶端機器也必須屬於該域。
有幾種選項可以在Apache Tomcat中實現整合的Windows身份驗證。它們是:
- 內建的Tomcat支援。
- 使用第三方庫,如Waffle。
- 使用支援Windows身份驗證的反向代理執行身份驗證步驟,如IIS或httpd。
以下部分討論了每個選項的配置。
內建的Tomcat支援
Kerberos(整合的Windows身份驗證的基礎)需要仔細的配置。如果按照本指南中的步驟執行,將會得到一個可工作的配置。重要的是要嚴格遵循下面的步驟。在配置中幾乎沒有靈活性。到目前為止的測試已經知道:
- 用於訪問Tomcat伺服器的主機名必須與SPN中的主機名完全匹配,否則認證將失敗。在這種情況下,除錯日誌中可能會報告校驗和錯誤。
- 客戶端必須認為伺服器是本地受信任的內部網路的一部分。
- SPN必須是HTTP/
,並且在使用的所有地方必須完全相同。 - 埠號不得包含在SPN中。
- 不得將多個SPN對映到一個域使用者。
- Tomcat必須以與SPN關聯的域帳戶或域管理員身份執行。不建議以域管理員使用者身份執行Tomcat。
- 慣例是始終使用域名(dev.local)的小寫。域名通常不區分大小寫。
- 慣例是始終使用Kerberos領域名稱(DEV.LOCAL)的大寫。領域名稱區分大小寫。
- 使用ktpass命令時必須指定域。
配置內建Tomcat支援Windows身份驗證需要四個元件:域控制器、託管Tomcat的伺服器、希望使用Windows身份驗證的Web應用程式和客戶端機器。以下各節描述了每個元件所需的配置。
在下面的配置示例中使用的三臺機器的名稱分別是win-dc01.dev.local(域控制器)、win-tc01.dev.local(Tomcat例項)和win-pc01.dev.local(客戶端)。它們都是dev.local域的成員。
注意:為了使用下面的步驟中的密碼,必須放寬域密碼策略。這在生產環境中不建議。
域控制器
這些步驟假定伺服器已經配置為充當域控制器。將Windows伺服器配置為域控制器的步驟不在本說明範圍內。配置域控制器以使Tomcat支援Windows身份驗證的步驟如下:
- 建立一個域使用者,該使用者將對映到Tomcat伺服器使用的服務名稱。在本說明中,此使用者稱為tc01,密碼為tc01pass。
- 將服務主體名稱(SPN)對映到使用者帳戶。SPN的形式為
/ : / 。本說明中使用的SPN是HTTP/win-tc01.dev.local。要將使用者對映到SPN,請執行以下命令: setspn -A HTTP/win-tc01.dev.local tc01
- 生成金鑰表檔案,Tomcat伺服器將使用該檔案向域控制器進行身份驗證。該檔案包含了服務提供程式帳戶的Tomcat私鑰,應當受到保護。要生成檔案,請執行以下命令(所有命令放在一行上):
ktpass /out c:\tomcat.keytab /mapuser tc01@DEV.LOCAL /princ HTTP/win-tc01.dev.local@DEV.LOCAL /pass tc01pass /kvno 0
- 建立一個用於客戶端的域使用者。在本說明中,域使用者為test,密碼為testpass。
上述步驟已在執行Windows Server 2019 Standard的域控制器上進行了測試,該伺服器使用了Windows Server 2016的功能級別,用於森林和域。
Tomcat例項(Windows伺服器)
這些步驟假定Tomcat和Java 11 JDK/JRE已經安裝和配置,並且Tomcat正在以tc01@dev.local使用者身份執行。配置Tomcat例項以進行Windows身份驗證的步驟如下:
-
將在域控制器上建立的tomcat.keytab檔案複製到$CATALINA_BASE/conf/tomcat.keytab。
-
建立Kerberos配置檔案$CATALINA_BASE/conf/krb5.ini。本說明中使用的檔案包含以下內容:
[libdefaults]
default_realm = DEV.LOCAL
default_keytab_name = FILE:c:\apache-tomcat-11.0.x\conf\tomcat.keytab
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
forwardable=true
[realms]
DEV.LOCAL = {
kdc = win-dc01.dev.local:88
}
[domain_realm]
dev.local= DEV.LOCAL
.dev.local= DEV.LOCAL
這個檔案的位置可以透過設定java.security.krb5.conf系統屬性來改變。
建立JAAS登入配置檔案$CATALINA_BASE/conf/jaas.conf。本說明中使用的檔案內容如下:
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
useKeyTab=true
keyTab="c:/apache-tomcat-11.0.x/conf/tomcat.keytab"
storeKey=true;
};
com.sun.security.jgss.krb5.accept {
com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=true
principal="HTTP/win-tc01.dev.local@DEV.LOCAL"
useKeyTab=true
keyTab="c:/apache-tomcat-11.0.x/conf/tomcat.keytab"
storeKey=true;
};
這個檔案的位置可以透過設定java.security.auth.login.config系統屬性來改變。使用的LoginModule是特定於JVM的,因此確保指定的LoginModule與使用的JVM匹配。登入配置的名稱必須與身份驗證閥值使用的值相匹配。
SPNEGO驗證器將與任何Realm一起工作,但如果與JNDI Realm一起使用,預設情況下,JNDI Realm將使用使用者的委派憑據連線到Active Directory。如果只需要認證的使用者名稱,則可以使用AuthenticatedUserRealm,它將簡單地返回基於認證使用者名稱的Principal,而不具有任何角色。
以上步驟已在執行Windows Server 2019 Standard和AdoptOpenJDK 8u232-b09(64位)的Tomcat伺服器上進行了測試。
Tomcat例項(Linux伺服器)
這是使用以下進行測試的:
- Java 1.7.0,更新45,64位
- Ubuntu Server 12.04.3 LTS 64位
- Tomcat 8.0.x(r1546570)
它應該適用於任何Tomcat版本,儘管建議使用最新的穩定版本。
配置與Windows相同,但有以下更改:
- Linux伺服器不必成為Windows域的一部分。
- 在krb5.ini和jaas.conf中,金鑰表檔案的路徑應更新為反映Linux伺服器上金鑰表檔案的路徑,使用Linux風格的檔案路徑(例如,/usr/local/tomcat/...)。
Web應用程式
Web應用程式需要在web.xml中配置使用Tomcat特定的SPNEGO身份驗證方法(而不是BASIC等)。與其他身份驗證器一樣,可以透過明確配置身份驗證閥和在閥上設定屬性來自定義行為。
客戶端
客戶端必須配置為使用Kerberos身份驗證。對於Internet Explorer,這意味著確保Tomcat例項位於“本地內部網路”安全域中,並且已配置(工具 > Internet選項 > 高階)啟用整合的Windows身份驗證。請注意,如果您將客戶端和Tomcat例項使用相同的計算機,那麼這將無法正常工作,因為Internet Explorer將使用不受支援的NTLM協議。
參考資料
正確配置Kerberos身份驗證可能會有些棘手。以下參考資料可能會有所幫助。
Tomcat使用者郵件列表上也始終提供建議。
- IIS和Kerberos
- SourceForge上的SPNEGO專案
- Oracle Java GSS-API教程(Java 7)
- Oracle Java GSS-API教程 - 故障排除(Java 7)
- Geronimo用於Windows身份驗證的配置
- 在Kerberos交換中選擇加密
- 支援的Kerberos密碼套件