Restful 具有 CXF 和 Kerberos 身份验证的服务

Restful service with CXF and Kerberos authentication

很难尝试使用 Kerberos 身份验证保护现有的 CXF JAX-RS 服务。

我浏览了似乎是参考文档的内容:http://cxf.apache.org/docs/jaxrs-kerberos.html 但没有太大帮助。

我实际上正在尝试配置 Tomcat+CXF 以重现这种 Apache 配置(有效):

<Directory /var/www/>
AuthType Kerberos
KrbServiceName HTTP/fqdn@realm
Krb5Keytab /path/to/file.keytab
Require valid-user
</Directory>

jaas.confkrb5.conf 已配置。 KerberosAuthenticationFilter 也在 CXF 配置中声明和引用。但是我什至无法达到获得 401 Forbidden 状态代码的地步。

我卡住了。非常感谢任何帮助。

你要考虑一下:

  1. 使用this this authenticator. Preferably from trunk or for Apache Web Server this.
  2. 如果CXF使用Apache HTTP Client,那就算了。当前的代码很糟糕。参见 HTTPCLIENT-1625

我终于找到了解决办法。

CXF 提供 KerberosAuthenticationFilter 但请不要使用 CXF 3.0.1。存在引发 NullPointerException 的错误。它在以下版本中得到修复(我不知道是哪个版本)。切换到 CXF 3.0.8 解决了这个问题。

1) 您需要在 beans.xml 中声明此过滤器:

<bean id="kerberosFilter" class="org.apache.cxf.jaxrs.security.KerberosAuthenticationFilter">
    <property name="loginContextName" value="mycontext"/>
    <property name="servicePrincipalName" value="HTTP/serviceprincipal@MYDOMAIN.COM"/>
</bean>

2) 并在端点定义中添加引用(仍在 beans.xml 中):

<jaxrs:server address="/">
    <jaxrs:serviceBeans>
        <ref bean="bean1" />
        <ref bean="bean2" />
        <ref bean="bean3" />
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <ref bean="someProvider" />
        <ref bean="someExceptionMappper" />
        <ref bean="kerberosFilter" />
    </jaxrs:providers>
</jaxrs:server>

3) 在Tomcat配置路径中添加JAAS配置文件jaas.conf($CATALINA_HOME/conf/) :

mycontext {
    com.sun.security.auth.module.Krb5LoginModule required
    doNotPrompt=true
    principal="HTTP/serviceprincipal@MYDOMAIN.COM"
    useKeyTab=true
    keyTab="/path/to/keytab/HTTP-serviceprincipal.keytab"
    debug=true
    storeKey=true;
};

4) 安装krb5-user 和curl 进行测试:

$ kinit (to authenticate againt the KDC)
$ klist (to verify)
$ curl --negotiate -u : http://serviceprincipal/rest/someservice

此处客户端(curl)将向我们受保护的服务器发送请求。服务器将发回包含特定 header 的 401 未授权状态响应:WWW-Authenticate:协商。 然后客户端将再次发送请求,但这次它在其 header 元数据中包含一个令牌。现在响应应该符合预期。

这对我有用。我希望它能帮助别人。

拉姆齐