我在 AD 中配置了一个使用委派 kerberos 票证的用户:
klist
Ticket cache: FILE:/tmp/krb5cc_527
Default principal: user1@EXAMPLE
Valid starting Expires Service principal 11/27/15 16:28:27 11/28/15 02:28:27 krbtgt/EXAMPLE.com@EXAMPLE.COM
我怎样才能得到这个'user1'?在此客户端域帐户(客户端 jsp?或服务器端?)上,我想在单击按钮后提取此值并将其传递回(使用 backurl)到另一个 java 应用程序。
编辑:
我的 Apache 配置:
<Location /kerb >
AuthType Kerberos
AuthName "auth-realm"
KrbMethodNegotiate off
KrbMethodK5Passwd off
KrbServiceName HTTP
Krb5Keytab /etc/krb5.keytab
require valid-user
</Location>
ProxyPreserveHost On
ProxyPass /kerb ajp://120.201.131.169:8019/myApp
ProxyPassReverse /kerb ajp://120.201.131.169:8019/myApp
但是我收到了
[Sun Dec 13 18:17:32 2015] [debug] src/mod_auth_kerb.c(1944): [client
126.185.3.202] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
最佳答案
这取决于。在我的例子中,我有一个配置了 mod_kerb
的 Apache 服务器。并通过AJP将http请求转发给Tomcat。
在这种情况下,Tomcat AJP 连接器配置为 tomcatAuthentication=false
我可以使用 request.getRemoteUser()
从 JSP 和 Servlet 获得用户身份验证.
显然,用户字符串在 @
之后带有域信息。所以你必须考虑它。
如果您对我的解决方案感兴趣,我可以详细说明我的答案。
编辑
我编辑我的答案以提供有关配置 Tomcat 以使用 Kerberos 的更多信息。
配置 NTP
首先,在每个系统 AD 服务器、Apache 服务器和 Tomcat 服务器中配置 NTP 客户端是很常见的。如果没有日期和时间同步,很常见得到 clock skew too great
或 postdating
问题。
为服务器创建 AD 主体
您需要在 AD 中创建一个主体以用于服务器主体身份验证。有必要为此主体获取 key 表文件。对不起,我不能告诉你怎么做。
在 Apache 服务器上安装和配置 Kerberos
获得服务器主体和 key 表文件后,就该配置 Apache 服务器了。将 kerberos 安装到该系统并配置 /etc/krb5.conf
.此文件的示例是:
HERE.YOUR.KERB.DOMAIN = {
kdc = your.dns.kerb.domain
admin_server = your.dns.kerb.domain
}
检查:
kinit -k -t keytab.file HTTP/principal.dns.name@HERE.YOUR.KERB.DOMAIN
klist
您的服务器配置正确。
安装和配置 mod_auth_kerb
安装
mod_auth_kerb
apache 模块并在每个 location
中配置其使用, directory
, virtual host
或任何你需要的,见下文。此配置非常依赖于您的 kerberos 服务器,您将不得不使用一些参数,例如 KDC 验证、协商、是否具有权威性……最重要的参数是
Krb5Keytab
, 但您可以查看 this page了解所有参数。这里有一个样本location
:<Location /sample/>
AuthType Kerberos
AuthName "auth-realm"
KrbMethodNegotiate on
KrbMethodK5Passwd off
Krb5Keytab /your/path/to/keytab.file
require valid-user
</Location>
当您尝试访问此位置时
http://your.apache.server/sample
Apache 将尝试通过 kerberos 检查用户凭据。AJP 配置
对于 AJP 配置(我之前已经回答过这个问题,但我在这里剪切并粘贴并适应这个问题),过程如下:
libapache2-mod-jk
. (在 debian/ubuntu 中你可以运行 sudo apt-get install libapache2-mod-jk
)。 jk
的新模块。或类似的。您必须启用它(在 debian/ubuntu 中,您可以运行 sudo a2enmod jk
)。 JkWorkersFile
观点。需要此文件来配置 workers
管理与 tomcat 应用程序的通信。 示例 worker 文件:
ps=/
worker.list=worker1,worker2,...
# worker1 definition
worker.worker1.port=8009
worker.worker1.host=host or ip
worker.worker1.type=ajp13
# worker2 definition
....
每个worker可以指向不同的tomcat服务器。端口必须与
$CATALINA_HOME/conf/server.xml
中配置的端口相同.在这个文件中有一个 AJP 协议(protocol)的连接器:<Connector port="8009" protocol="AJP/1.3"
redirectPort="8443" tomcatAuthentication="false"/>
每个 worker 都必须指向这个端口。
最后,您可以使用
JkMount workerName
配置您的位置(或其他)。指示 Apache 必须将此 url 转发给适当的工作人员:<Location /sample/>
JkMount worker1
AuthType Kerberos
AuthName "auth-realm"
KrbMethodNegotiate on
KrbMethodK5Passwd off
Krb5Keytab /your/path/to/keytab.file
require valid-user
</Location>
有很多示例文档。这里有 Tomcat 官方文档:https://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
网络应用认证
您无需在
web.xml
中配置任何有关安全约束的内容。 ,使用此配置,Apache 将验证用户而不是 Tomcat,并且 Tomcat 将在 HTTP 请求中接收用户的主体名称。Tomcat(和任何其他 servlet 容器)会将用户的主体封装到
request.getRemoteUser()
.希望能帮助到你。
关于java - Kerberos 如何获取主体或客户端名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001683/