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.conf 和 krb5.conf 已配置。 KerberosAuthenticationFilter 也在 CXF 配置中声明和引用。但是我什至无法达到获得 401 Forbidden 状态代码的地步。
我卡住了。非常感谢任何帮助。
你要考虑一下:
- 使用this this authenticator. Preferably from trunk or for Apache Web Server this.
- 如果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 元数据中包含一个令牌。现在响应应该符合预期。
这对我有用。我希望它能帮助别人。
拉姆齐
很难尝试使用 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.conf 和 krb5.conf 已配置。 KerberosAuthenticationFilter 也在 CXF 配置中声明和引用。但是我什至无法达到获得 401 Forbidden 状态代码的地步。
我卡住了。非常感谢任何帮助。
你要考虑一下:
- 使用this this authenticator. Preferably from trunk or for Apache Web Server this.
- 如果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 元数据中包含一个令牌。现在响应应该符合预期。
这对我有用。我希望它能帮助别人。
拉姆齐