web server apache tomcat11-29-Windows Authentication

前言

整理这个官方翻译的系列,原因是网上大部分的 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身份验证的步骤如下:

  1. 创建一个域用户,该用户将映射到Tomcat服务器使用的服务名称。在本说明中,此用户称为tc01,密码为tc01pass。

  2. 将服务主体名称(SPN)映射到用户帐户。SPN的形式为 / : / 。本说明中使用的SPN是HTTP/win-tc01.dev.local。要将用户映射到SPN,请运行以下命令:

    复制代码
    setspn -A HTTP/win-tc01.dev.local tc01
  3. 生成密钥表文件,Tomcat服务器将使用该文件向域控制器进行身份验证。该文件包含了服务提供程序帐户的Tomcat私钥,应当受到保护。要生成文件,请运行以下命令(所有命令放在一行上):

    复制代码
    ktpass /out c:\tomcat.keytab /mapuser [email protected]
              /princ HTTP/[email protected]
              /pass tc01pass /kvno 0
  4. 创建一个用于客户端的域用户。在本说明中,域用户为test,密码为testpass。

上述步骤已在运行Windows Server 2019 Standard的域控制器上进行了测试,该服务器使用了Windows Server 2016的功能级别,用于森林和域。

Tomcat实例(Windows服务器)

这些步骤假定Tomcat和Java 11 JDK/JRE已经安装和配置,并且Tomcat正在以[email protected]用户身份运行。配置Tomcat实例以进行Windows身份验证的步骤如下:

  1. 将在域控制器上创建的tomcat.keytab文件复制到$CATALINA_BASE/conf/tomcat.keytab。

  2. 创建Kerberos配置文件$CATALINA_BASE/conf/krb5.ini。本说明中使用的文件包含以下内容:

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。本说明中使用的文件内容如下:

conf 复制代码
com.sun.security.jgss.krb5.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/[email protected]"
    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/[email protected]"
    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密码套件
相关推荐
张张张3122 分钟前
4.2学习总结 Java:list系列集合
java·学习
KATA~5 分钟前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
xyliiiiiL21 分钟前
一文总结常见项目排查
java·服务器·数据库
shaoing23 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
腥臭腐朽的日子熠熠生辉1 小时前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian1 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码2 小时前
Spring Task 定时任务
java·前端·spring
俏布斯2 小时前
算法日常记录
java·算法·leetcode
27669582922 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿