繁体   English   中英

如何配置JBoss EAP 6.3 WebApp以进行Kerberos身份验证

[英]How to configure JBoss EAP 6.3 WebApp for Kerberos authentication

我需要配置JBoss EAP 6.3来理解Kerberos身份验证。

我的环境包括:

  • 使用JBoss EAP 6.3的linux服务器
  • Windows 7 64bit + Chrome的客户端工作站
  • Windows Server 2008 Active Directory(充当KDC)

我已经尝试过很多例子,但都没有。 基本上我根据这个文件做了一切: RedHat JBoss 6.3 Kerberos

和本文档: JBoss博客RadoslawRodak

和本文档: JBoss开发人员博客

我从测试servlet(jboss-negotiation-toolkit)得到的所有内容都是这样的消息:WARN [org.jboss.security.auth.spi.AbstractServerLoginModule](http- / 172.27.185.220:8080-1)不支持的协商机制'NTLM'

有没有人全力以赴,并以某种方式解决了它?

约瑟夫,提前谢谢你

看看我的SPNEGO演示项目https://github.com/kwart/spnego-demo

尝试使用链接的kerberos-using-apacheds项目。

如果您可以成功对ApacheDS Kerberos进行身份验证,请尝试更改配置( host安全域中的krb5.confKrb5LoginModule选项)以使用Active Directory进行身份验证。

常见的陷阱是错误的SPN名称 服务主体必须是HTTP/hostname@REALM格式(例如HTTP/hostname@REALM HTTP/www.my-company.com@MY-COMPANY.COM

您可以在我的旧演示文稿中找到一些其他提示 - http://www.slideshare.net/josef.cacek/dev-conf2013-ltkerberosas7

谢谢你们。 正如我之前所说,我们终于做到了。 我们的解决方案是

0)客户端计算机必须在域中,前提是域凭据不够。

创建密钥表(对于2008服务器是关键的kvno 0):

ktpass -out bbb.keytab -princ HTTP/bbb.cez.loc@CEZ.LOC -mapUser CEZ.LOC\bbb -mapOp set -pass password -ptype KRB5_NT_PRINCIPAL -kvno 0

ktab  -k bbb.keytab -l -e -t
Keytab name: bbb.keytab
KVNO Timestamp      Principal
0 1/1/70 1:00 AM HTTP/bbb.cez.loc@CEZ.LOC (23:RC4 with HMAC)

停止JBoss并将其传输到JBoss配置文件夹下的linux。 /opt/jboss-domain/standalone/configuration/bbb.keytab

1)JBoss配置(standalone.xml)

<system-properties>
  <property name="java.security.krb5.kdc" value="CEZ.LOC"/>
  <property name="java.security.krb5.realm" value="CEZ.LOC"/>
  <property name="java.net.debug" value="all"/>
  <property name="sun.security.krb5.debug" value="true"/>
</system-properties>

<security-domain name="host" cache-type="default">
  <authentication>
    <login-module code="Kerberos" flag="required">
       <module-option name="storeKey" value="true"/>
       <module-option name="useKeyTab" value="true"/>
       <module-option name="principal" value="HTTP/bbb.cez.loc@CEZ.LOC"/>
       <module-option name="keyTab" value="/opt/jboss-domain/standalone/configuration/bbb.keytab"/>
       <module-option name="doNotPrompt" value="true"/>
       <module-option name="debug" value="true"/>
    </login-module>
 </authentication>
</security-domain>

<security-domain name="SPNEGO" cache-type="default">
<authentication>
  <login-module code="SPNEGO" flag="requisite">
     <module-option name="password-stacking" value="useFirstPass"/>
     <module-option name="serverSecurityDomain" value="host"/>
  </login-module>
</authentication>
</security-domain>

2)Web App配置:

web.xml:
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Restricted</web-resource-name>
        <url-pattern>/rest/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<security-role>
    <role-name>*</role-name>
</security-role>

jboss-web.xml:
<jboss-web>  
    <security-domain>java:/jaas/SPNEGO</security-domain>  
        <valve>  
        <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name>  
        </valve>  
    <context-root>kerberoes</context-root>  
</jboss-web>

jboss-deployment-structure.xml:
<jboss-deployment-structure>  
  <deployment>  
    <dependencies>  
      <module name="org.jboss.security.negotiation" />  
    </dependencies>  
  </deployment>  
</jboss-deployment-structure> 

3)在AD上重启密钥分发服务

4)启动JBoss

5)将JBoss Web服务器地址添加到可信主机,进入Intranet部分下的Internet设置。 一切都从那一刻开始。

Rest Web App可以使用它来获取有效凭据:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;

@Path("/ping")
public class Ping extends Application
{
    @Context  
    private SecurityContext mySecurityContext;  

    @GET
    public Response doGET() 
    {
        try
        {
            Date now = Calendar.getInstance().getTime();        
            String reportDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(now);
            String returnString = "";

            // return ok json
            returnString = "Time: " + reportDate + "<br>\n";
            returnString += "User: " +
            mySecurityContext.getAuthenticationScheme() + " / " + 
            mySecurityContext.getUserPrincipal().getName() + "<br>\n";
           return Response.status(200).entity(returnString).build();
        }
        catch (Exception e)
        {
           return Response.status(500).entity("Exception! " +
           e.getMessage()).build();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM