有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Kerberos如何获取主体或客户端名称?

我在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

共 (3) 个答案

  1. # 1 楼答案

    我明白了!我不知道到底出了什么问题,但现在它起作用了。 我可以通过以下配置从HTTP头简单地获取主体(我将此配置从/conf.d移到了main/conf/httpd.conf文件)。什么是进口的。在RHEL httpd服务器上,apache用户应该有权读取/etc/krb5。键表。就我而言:

    ps -ef | grep httpd

    apache 27537 27535 0 16:18 ? 00:00:00 /usr/sbin/httpd

    <VirtualHost myhost.domain.com:80>
    
    ServerName myhost.domain.com
    
    <Location /myApp >
    #   SSLRequireSSL
    AuthType Kerberos     
    KrbMethodNegotiate On
    KrbMethodK5Passwd Off
    KrbServiceName HTTP/nmyhost.domain.com@EXAMPLE.COM
    KrbAuthRealms EXAMPLE.COM
    Krb5KeyTab /etc/krb5.keytab
    require valid-user
    
    RewriteEngine On
    RewriteCond %{LA-U:REMOTE_USER} (.+)
    RewriteRule . - [E=RU:%1]
    Header add X-Remote-User "%{RU}e" env=RU  
    </Location>
    
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass /myApp ajp://126.101.100.169:8029/myApp
    ProxyPassReverse /myApp ajp://126.101.100.169:8029/myApp
    
    </VirtualHost>
    
  2. # 2 楼答案

    视情况而定。在我的例子中,我使用mod_kerb配置了一个Apache服务器,并通过AJP将http请求转发给Tomcat

    在这种情况下,Tomcat AJP Conctor配置为tomcatAuthentication=false,我可以使用request.getRemoteUser()从JSP和Servlet获得用户身份验证

    显然,用户字符串在{{CD4}}之后附带域信息,所以您必须考虑它。

    如果您对我的解决方案感兴趣,我可以详细说明我的答案

    编辑

    我编辑我的答案,以提供有关配置Tomcat以使用Kerberos的更多信息

    配置NTP

    在每个Apache服务器中,首先配置的是非常常见的Tomp客户端。如果没有日期和时间同步,很容易出现clock skew too greatpostdating问题

    为服务器创建AD主体

    您需要在AD中创建主体以用于服务器主体身份验证。必须获取此主体的键表文件。对不起,我不能告诉你怎么做

    在Apache服务器上安装和配置Kerberos

    一旦有了服务器主体和keytab文件,就可以配置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_路缘石

    安装mod_auth_kerbapache模块,并在每个locationdirectoryvirtual 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/sampleApache将尝试通过kerberos检查用户凭据

    AJP配置

    对于AJP配置(我之前已经回答了这个问题,但我在这里剪切粘贴并适应了这个问题),程序如下:

    • 为AJP安装Apache模块,通常称为libapache2-mod-jk。(在debian/ubuntu中,您可以运行sudo apt-get install libapache2-mod-jk
    • 然后您将有一个名为jk或类似的新模块。您必须启用它(在debian/ubuntu中,您可以运行sudo a2enmod jk
    • 默认配置将主要提供服务,打开它看看JkWorkersFile指向何处。需要此文件来配置管理与tomcat应用程序通信的workers
    • 创建工人文件(如果不存在)。workers文件大致如下所示

    示例工人文件:

    ps=/
    worker.list=worker1,worker2,...
    
    # worker1 definition
    worker.worker1.port=8009
    worker.worker1.host=host or ip
    worker.worker1.type=ajp13
    
    # worker2 definition
    ....
    

    每个工人都可以指向不同的tomcat服务器。端口必须与配置到$CATALINA_HOME/conf/server.xml中的端口相同。在该文件中,有一个用于AJP协议的连接器:

    <Connector port="8009" protocol="AJP/1.3" 
        redirectPort="8443" tomcatAuthentication="false"/>
    

    每个工人都必须指向这个端口

    最后,您可以使用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应用程序身份验证

    您不需要在web.xml中配置任何关于安全约束的内容,通过这种配置,Apache将认证用户而不是Tomcat,Tomcat将在HTTP请求中接收用户的主体名称

    Tomcat(和任何其他servlet容器)将把用户的主体封装到request.getRemoteUser()

    希望能有帮助

  3. # 3 楼答案

    尝试检查您的keytab文件。我也有类似的问题,当我跑步的时候

    cat httpd。键表

    它显示的是纯文本,这是不正常的,keytab文件应该包含ASCII字符,它是一个二进制文件。然后用“$Admin”重新生成它的域名