Hi Marco,
Thanks for posting the logs below,
I think we can narrow down the issue to the following:
- the token created by CURL contains a permission to delegate on the
server side
- the token created by CXF contains no such permission
It is something to do with the current process properties. This is my
theory at least. Or with something very subtle.
You curl command line has no any Kerberos specific configuration, so I'm
presuming, that when you run CURL, you as a root/etc has all the access
rights to the default Kerberos store, right ?
I recall we had a user few weeks or so ago actually confirming the
delegation works, though in that case a CXF server was extracting the
token sent by the client and using it with the outbound client call...
Here is the relevant CXF code:
GSSManager manager = GSSManager.getInstance();
(1)
GSSName serverName = manager.createName(spn, null);
(2)
GSSCredential delegatedCred =
(GSSCredential)message.getContextualProperty(GSSCredential.class.getName());
GSSContext context = manager
.createContext(serverName.canonicalize(oid), oid,
delegatedCred, GSSContext.DEFAULT_LIFETIME);
(3)
context.requestCredDeleg(isCredDelegationRequired(message));
// If the delegated cred is not null then we only need the
context to
// immediately return a ticket based on this credential without
attempting
// to log on again
return getToken(delegatedCred == null ? authPolicy : null,
context);
All CXF does (assuming delegatedCred is not set - as in your case) it
requests the delegation if the user wants it to,
and then acquires a token, passing it the auth policy, in your case it
is a KeyTab reference. And the token is acquited successfully but it has
no delegation property set in it...
I'm not sure what to get out of it so far...
Please continue investigating.
What about enabling the Kerberos-level debug, that may show the way curl
& CXF interacts with it ? May be the Java process has no enough
privileges to enable the delegation ?
Thanks, Sergey
On 25/03/14 09:03, Marco Di Sabatino Di Diodoro wrote:
Hi Sergey,
Il giorno 19/mar/2014, alle ore 10:57, Sergey Beryozkin <sberyoz...@gmail.com>
ha scritto:
Hi Marco
On 19/03/14 08:44, Marco Di Sabatino Di Diodoro wrote:
Hi Sergey
thanks for your support.
We asked the FreeIPA community to see if there are some incorrect
configurations[1].
I'll let you know when we have news.
Sounds good, thanks.
What concerns me is the fact that using CURL to send Kerberos tokens to FreeIPA
works, while using WebClient and Kerberos interceptor does not.
I suspect that something in the CXF code might need to be tweaked or may be it
needs to be reconfigured a bit.
The logs you sent last time show that CXF manages to obtain a token but it is
really a server which does not accept it. So I think CXF does correctly
interacts with the Kerberos system, but what appears to be the case is that
there is some difference in the way CXF and CURL send tokens.
Can you please run CURL with -v option and see if you can spot something
obvious, compared to the way CXF sends it ?
these days, we are investigating why the call does not work with the java
client.
Our goal is to call a jsonrpc api protected from Kerberos. So we trying to call
apache httpd with mod_auth_kerb. This is our cxf example [1].
After cxf call, I noticed that httpd log has
[Mon Mar 24 19:03:29.402055 2014] [auth_kerb:debug] [pid 10029]
src/mod_auth_kerb.c(1724): [client 192.168.0.105:39499] Client didn't delegate
us their credential, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:03:29.402084 2014] [auth_kerb:debug] [pid 10029]
src/mod_auth_kerb.c(1743): [client 192.168.0.105:39499] GSS-API token of length
186 bytes will be sent back, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:03:29.402510 2014] [:info] [pid 10029] nss_hook_Auth
[Mon Mar 24 19:03:29.402577 2014] [authz_core:debug] [pid 10029]
mod_authz_core.c(802): [client 192.168.0.105:39499] AH01626: authorization
result of Require valid-user : granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:03:29.402676 2014] [authz_core:debug] [pid 10029]
mod_authz_core.c(802): [client 192.168.0.105:39499] AH01626: authorization result of
<RequireAny>: granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:03:29.403068 2014] [authz_core:debug] [pid 10029]
mod_authz_core.c(802): [client 192.168.0.105:39499] AH01626: authorization
result of Require all granted: granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:03:29.403172 2014] [authz_core:debug] [pid 10029]
mod_authz_core.c(802): [client 192.168.0.105:39499] AH01626: authorization result of
<RequireAny>: granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:03:29.403908 2014] [:error] [pid 10025] ipa: ERROR: 500 Internal
Server Error: jsonserver_kerb.__call__: KRB5CCNAME not defined in HTTP request
environment
[Mon Mar 24 19:03:29.404844 2014] [headers:debug] [pid 10029]
mod_headers.c(845): AH01502: headers: ap_headers_output_filter()
Whereas if I done the same call with curl on the httpd log there’s
[Mon Mar 24 19:14:43.329966 2014] [auth_kerb:debug] [pid 10032]
src/mod_auth_kerb.c(1724): [client 192.168.0.105:39504] Client delegated us
their credential, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:14:43.329977 2014] [auth_kerb:debug] [pid 10032]
src/mod_auth_kerb.c(1743): [client 192.168.0.105:39504] GSS-API token of length
156 bytes will be sent back, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:14:43.338700 2014] [:info] [pid 10032] nss_hook_Auth
[Mon Mar 24 19:14:43.338721 2014] [authz_core:debug] [pid 10032]
mod_authz_core.c(802): [client 192.168.0.105:39504] AH01626: authorization
result of Require valid-user : granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:14:43.338726 2014] [authz_core:debug] [pid 10032]
mod_authz_core.c(802): [client 192.168.0.105:39504] AH01626: authorization result of
<RequireAny>: granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:14:43.338878 2014] [authz_core:debug] [pid 10032]
mod_authz_core.c(802): [client 192.168.0.105:39504] AH01626: authorization
result of Require all granted: granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:14:43.338886 2014] [authz_core:debug] [pid 10032]
mod_authz_core.c(802): [client 192.168.0.105:39504] AH01626: authorization result of
<RequireAny>: granted, referer: https://olmo.tirasa.net/ipa
[Mon Mar 24 19:14:44.371738 2014] [:error] [pid 10024] ipa: INFO:
ad...@tirasa.net: user_find(u'', all=u'true'): SUCCESS
[Mon Mar 24 19:14:44.372957 2014] [headers:debug] [pid 10032]
mod_headers.c(845): AH01502: headers: ap_headers_output_filter()
[Mon Mar 24 19:14:44.375508 2014] [:info] [pid 10032] Connection to child 4
closed (server olmo.tirasa.net:443, client 192.168.0.105)
Curl with -v option log:
curl -v -H referer:https://olmo.tirasa.net/ipa -H "Content-Type:application/json" -H "Accept:applicaton/json" --negotiate -u : --delegation always
--cacert /etc/ipa/ca.crt -d '{"method":"user_find","params":[[""],{"all":"true"}],"id":0}' -X POST
https://olmo.tirasa.net/ipa/json
* Adding handle: conn: 0xc24ec0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xc24ec0) send_pipe: 1, recv_pipe: 0
* About to connect() to olmo.tirasa.net port 443 (#0)
* Trying 192.168.0.106...
* Connected to olmo.tirasa.net (192.168.0.106) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/ipa/ca.crt
CApath: none
* SSL connection using TLS_RSA_WITH_AES_128_CBC_SHA
* Server certificate:
* subject: CN=olmo.tirasa.net,O=TIRASA.NET
* start date: mar 13 13:48:58 2014 GMT
* expire date: mar 13 13:48:58 2016 GMT
* common name: olmo.tirasa.net
* issuer: CN=Certificate Authority,O=TIRASA.NET
POST /ipa/json HTTP/1.1
User-Agent: curl/7.32.0
Host: olmo.tirasa.net
referer:https://olmo.tirasa.net/ipa
Content-Type:application/json
Accept:applicaton/json
Content-Length: 60
* upload completely sent off: 60 out of 60 bytes
< HTTP/1.1 401 Unauthorized
< Date: Tue, 25 Mar 2014 08:17:15 GMT
* Server Apache/2.4.7 (Fedora) mod_auth_kerb/5.4 mod_nss/2.4.6 NSS/3.15.3 Basic
ECC mod_wsgi/3.4 Python/2.7.5 is not blacklisted
< Server: Apache/2.4.7 (Fedora) mod_auth_kerb/5.4 mod_nss/2.4.6 NSS/3.15.3
Basic ECC mod_wsgi/3.4 Python/2.7.5
< WWW-Authenticate: Negotiate
< Last-Modified: Tue, 28 Jan 2014 08:12:54 GMT
< Accept-Ranges: bytes
< Content-Length: 1383
< Content-Type: text/html; charset=UTF-8
<
* Ignoring the response-body
* Connection #0 to host olmo.tirasa.net left intact
* Issue another request to this URL: 'https://olmo.tirasa.net/ipa/json'
* Found bundle for host olmo.tirasa.net: 0xc258a0
* Re-using existing connection! (#0) with host olmo.tirasa.net
* Connected to olmo.tirasa.net (192.168.0.106) port 443 (#0)
* Adding handle: conn: 0xc24ec0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xc24ec0) send_pipe: 1, recv_pipe: 0
* Server auth using GSS-Negotiate with user ''
POST /ipa/json HTTP/1.1
Authorization: Negotiate
YIIE8QYJKoZIhvcSAQICAQBuggTgMIIE3KADAgEFoQMCAQ6iBwMFACAAAACjggFVYYIBUTCCAU2gAwIBBaEMGwpUSVJBU0EuTkVUoiIwIKADAgEBoRkwFxsESFRUUBsPb2xtby50aXJhc2EubmV0o4IBEjCCAQ6gAwIBEqEDAgECooIBAASB/fM6eW0p4pD8wvFfwNLF5R5wq5jjmY4nSCij5Ijom2SFhtxB7GYHIHGmU7/obmkKG2zqW/a7Uw85fLh+lkZJ+z1WjBwNswAOBIQ7+9NaHcOJXGttuyToiqCuUdfm6RndbrZ1e7heIsS9CajEACmOiY5T7hJa2Ld8chN6xHLhbJlqTmcFcRRwHNDA/ehxgGe5xXQg7NZd4LSWbRjsDdS/NlmxY3EPVHZhLn0MCG/sG+b2favQbn9tTfEOU3S5zK47eUNC39e25sN6WkGImGL2d90G0vgnpGFW/DXcqEWH8+wXaVL4fzTR93wkzk56hLhtYvxmjDxOer/6/kXR4z2kggNsMIIDaKADAgESooIDXwSCA1vo49R1NgVJXKb4nhEZAMggkNY+S2SmMgb3m/cc7Hkq6kb+Jz8ClM51SjV5eUYI70dYbp/e8FoZwq5irwfG+s4KKRkhCZX5y8t6cOewU2cp++7J8M8G6GHOw7sm+TOdAQfwsVPWqgHhw69Ih7W48inYazDkyJfr4k9+Vu3IZxjyJBlaF6idV5w8cFK0LuSVrUDtk74MJ+mM08jE0wWONqHcoWD/xYklShavDb0bOvEm7TfvBKYuwsrsGl4ubgphvWcd+DnT/dFjtx583GbiqgSDSbHUEC93C9DIcxnUwqbsMWKDohtsG1dTZp/JfX3yQdoa/lfyn32fIPyP7ucwZWN/hy3JUgizI6WdVR+2z3lqSCG3WIzVAQLYek+SZbQ4gmhOl6SydF7sYlqAjSNoBHSTxB610+pIak/uR2qrqa
2
VPWlsX8aAKaYrlPSVyckxtTb1G/OFahIZJPA0m/CIYJjFF0E/TnhmkwdPaIHQ5miOVwxDMUL1dBQXO9w1gwCcvbLrt3N43Ogo6DlOGj3Ticst9gZMBXeDPwrnOufB5FZBWtksc9fonyZRyq70c7GOrShwVjqlpG4toZcLRba0kCpggjxmV45o+AedpV9I9fYP8tDV619e1EtDGGKnsSfiRzINqFYA8jlKpSTjVPZNqTPh140bsmqDRQtvSRNfb7ftlLfF+lI7UmCeJB31d6CUQkqr4MV7PO7zAMjji8DSzPgzpjnYAi2Re+kzbJmllEzUQarFMKM9VEmpCO0Q3SKcM64Rw5qRajFwaduQ2oPCe1Mrws++jtxHDvXtm77Rc0NM30uJcriauCj5XYbfMPHnbqHFa+iFB3OtedbU+HAtth2S0IC/47LgoV0GnVLZWU18P0LTtQwiyJ6p/pRpUiMJB8LwjV8eKsZOSnJDFCXN3ulOuC/xEV4/eumQPg9Eq/eYdQH8xoGCUVKiriEfJD9eilYe+fZWJOfwSgHGiddVZqBoAsALjr/snkF8O0oCP2d0YxrBb/xpbLexXEhLw84FtKtthZGsIfEB5JLpeWj/7FDNj3AHWSYq2qg2ajB87p6VTw+eSEspdmPCbn/mzo/IrVr0Iv3RD3tIodcqKWY/sr/VU2YjBKGj/zVbYxOgRf8DohuqOZ4Qglo4dmUi
User-Agent: curl/7.32.0
Host: olmo.tirasa.net
referer:https://olmo.tirasa.net/ipa
Content-Type:application/json
Accept:applicaton/json
Content-Length: 60
* upload completely sent off: 60 out of 60 bytes
< HTTP/1.1 200 Success
< Date: Tue, 25 Mar 2014 08:17:15 GMT
* Server Apache/2.4.7 (Fedora) mod_auth_kerb/5.4 mod_nss/2.4.6 NSS/3.15.3 Basic
ECC mod_wsgi/3.4 Python/2.7.5 is not blacklisted
< Server: Apache/2.4.7 (Fedora) mod_auth_kerb/5.4 mod_nss/2.4.6 NSS/3.15.3
Basic ECC mod_wsgi/3.4 Python/2.7.5
< WWW-Authenticate: Negotiate
YIGZBgkqhkiG9xIBAgICAG+BiTCBhqADAgEFoQMCAQ+iejB4oAMCARKicQRvc4GoDMzW+ZiPr3J9m2XX/cQl2kVjQBeSNfBy89lI/xnvdDcEArVUOTNJeaKKaGR4W/Tv0op0ZUsVw8M7UHu+tmndta9kYG4WAORN6RHGPL4ww8br/oFtCUAcretWQzkfeOMMHrYjQfvFl3GkjUJs
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: application/json; charset=utf-8
<
{
"error": null,
"id": 0,
"principal": "ad...@tirasa.net",
"result": {
"count": 1,
"messages": [
{
"code": 13001,
"message": "API Version number was not sent, forward compatibility
not guaranteed. Assuming server's API version, 2.65",
"name": "VersionMissing",
"type": "warning"
}
],
"result": [
{
"cn": [
"Administrator"
],
"dn": "uid=admin,cn=users,cn=accounts,dc=tirasa,dc=net",
"gecos": [
"Administrator"
],
"gidnumber": [
"163600000"
],
"has_keytab": true,
"has_password": true,
"homedirectory": [
"/home/admin"
],
"ipauniqueid": [
"a524777e-aab5-11e3-bd11-080027e7a744"
],
"krbextradata": [
{
"__base64__":
"AALItyFTcm9vdC9hZG1pbkBUSVJBU0EuTkVUAA=="
}
],
"krblastpwdchange": [
"20140313135104Z"
],
"krblastsuccessfulauth": [
"20140325081717Z"
],
"krbpasswordexpiration": [
"20140611135104Z"
],
"krbprincipalname": [
"ad...@tirasa.net"
],
"loginshell": [
"/bin/bash"
],
"memberof_group": [
"admins",
"trust admins"
],
"nsaccountlock": false,
"objectclass": [
"top",
"person",
"posixaccount",
"krbprincipalaux",
"krbticketpolicyaux",
"inetuser",
"ipaobject",
"ipasshuser",
"ipaSshGroupOfPubKeys"
],
"sn": [
"Administrator"
],
"uid": [
"admin"
],
"uidnumber": [
"163600000"
]
}
],
"summary": "1 user matched",
"truncated": false
},
"version": "3.3.4"
* Connection #0 to host olmo.tirasa.net left intact
What do you think? Any suggestions?
M
[1]
https://github.com/massx1/KerberosExample/blob/master/src/main/java/net/tirasa/kerberosexample/CXFClient.java
Thanks, Sergey
Thanks
M
[1] https://www.redhat.com/archives/freeipa-devel/2014-March/msg00296.html
Il giorno 17/mar/2014, alle ore 19:10, Sergey Beryozkin <sberyoz...@gmail.com>
ha scritto:
Hi
How do you configure it with curl ?
In your opinion, what is the difference between the way you set it up in curl
and in CXF ?
Cheers, Sergey
On 17/03/14 15:53, Marco Di Sabatino Di Diodoro wrote:
Hi,
Il giorno 15/mar/2014, alle ore 13:38, Andrei Shakirin
<ashaki...@talend.com <mailto:ashaki...@talend.com>> ha scritto:
Hi Marco,
I would suggest to try simple Kerberos login using JAAS directly (with
debug=true), perhaps it helps to spot the problem:
Test code:
URL conf =
JaasLoginTest.class.getClassLoader().getResource("jaas.conf");
System.setProperty("java.security.auth.login.config",
conf.toString());
// Only needed when not using the ticket cache
CallbackHandler callbackHandler = new CallbackHandler() {
@Override
public void handle(Callback[] callbacks) throws
IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
if (callback instanceof NameCallback) {
((NameCallback)callback).setName("alice");
}
if (callback instanceof PasswordCallback) {
((PasswordCallback)callback).setPassword("clarinet".toCharArray());
}
}
}
};
try {
LoginContext lc = new LoginContext("myContext",
callbackHandler);
lc.login();
Subject subject = lc.getSubject();
Set<Principal> principals = subject.getPrincipals();
Set<Object> credentials = subject.getPrivateCredentials();
System.out.println("OK: " + principals);
System.out.println("OK: " + credentials);
} catch (LoginException e) {
e.printStackTrace();
}
}
Jaas.conf:
myContext {
com.sun.security.auth.module.Krb5LoginModule required
debug=true
refreshKrb5Config=true
useKeyTab=true
storeKey=true
keyTab="my.keytab"
principal="my/services.example.com <http://services.example.com>";
};
If the code works, you will be able to detect what is different with
AbstractSpnegoAuthSupplier.getToken() code used from
KerberosAuthOutInterceptor.java.
this are krb5kdc.log when needs to connect with cxf to FreeIpa Server:
mar 17 16:03:10 olmo.tirasa.net <http://olmo.tirasa.net>
krb5kdc[1423](info): AS_REQ (4 etypes {18 17 16 23}) 192.168.0.176:
ISSUE: authtime 1395068590, etypes {rep=18 tkt=18 ses=18},
ad...@tirasa.net <mailto:ad...@tirasa.net> for
krbtgt/tirasa....@tirasa.net <mailto:krbtgt/tirasa....@tirasa.net>
mar 17 16:03:10 olmo.tirasa.net <http://olmo.tirasa.net>
krb5kdc[1423](info): TGS_REQ (6 etypes {18 17 16 23 1 3}) 192.168.0.176:
ISSUE: authtime 1395068590, etypes {rep=18 tkt=18 ses=18},
ad...@tirasa.net <mailto:ad...@tirasa.net> for
ldap/olmo.tirasa....@tirasa.net <mailto:ldap/olmo.tirasa....@tirasa.net>
If we run with curl:
mar 17 16:14:06 olmo.tirasa.net <http://olmo.tirasa.net>
krb5kdc[1423](info): TGS_REQ (1 etypes {18}) 192.168.0.106: ISSUE:
authtime 1395069156, etypes {rep=18 tkt=18 ses=18}, ad...@tirasa.net
<mailto:ad...@tirasa.net> for krbtgt/tirasa....@tirasa.net
<mailto:krbtgt/tirasa....@tirasa.net>
mar 17 16:14:06 olmo.tirasa.net <http://olmo.tirasa.net>
krb5kdc[1423](info): TGS_REQ (6 etypes {18 17 16 23 25 26})
192.168.0.106: ISSUE: authtime 1395069156, etypes {rep=18 tkt=18
ses=18}, ad...@tirasa.net <mailto:ad...@tirasa.net> for
ldap/olmo.tirasa....@tirasa.net <mailto:ldap/olmo.tirasa....@tirasa.net>
I have attached the log file of the test connector. As you can see from
the log, at the beginning we make a login and after a request to the
service, but returns a 401.
Thanks
M
Regards,
Andrei.
-----Original Message-----
From: Marco Di Sabatino Di Diodoro [mailto:marco.disabat...@tirasa.net]
Sent: Freitag, 14. März 2014 17:54
To: users@cxf.apache.org <mailto:users@cxf.apache.org>
Subject: CXF and kerberos authentication
Hi,
I'm an PMC member of Apache Syncope[1].
We are building a new connector bundle for Connid[2] that needs to
connect
with FreeIpa server.
The connector bundle use JSON-RPC to communicate with the server that is
protected by Kerberos.
We followed this guide
(http://cxf.apache.org/docs/jaxrs-kerberos.html) but the
connector not negotiate with Kerberos
WebClient wc = WebClient.create("https://olmo.example.com/ipa/json");
WebClient.getConfig(wc).getHttpConduit().setTlsClientParameters(clientParam
eters());
AuthorizationPolicy policy = new AuthorizationPolicy();
policy.setAuthorizationType("Negotiate");
policy.setAuthorization(KEYTAB_CONF);
KerberosAuthOutInterceptor kbInterceptor = new
KerberosAuthOutInterceptor(); kbInterceptor.setPolicy(policy);
kbInterceptor.setRealm("EXAMPLE.COM <http://EXAMPLE.COM>");
kbInterceptor.setServicePrincipalName("ldap/olmo.example.com
<http://olmo.example.com>");
kbInterceptor.setCredDelegation(true);
WebClient.getConfig(wc).getOutInterceptors().add(kbInterceptor);
I try a lot of other configuration without success, have you any
suggestion?
If we run with curl it works.
Regards
M
[1] http://syncope.apache.org/
[2] http://tirasa.github.io/ConnId/
--
Dott. Marco Di Sabatino Di Diodoro
Tel. +39 3939065570
Tirasa S.r.l.
Viale D'Annunzio 267 - 65127 Pescara
Tel +39 0859116307 / FAX +39 0859111173
http://www.tirasa.net
Apache Syncope PMC Member
http://people.apache.org/~mdisabatino/
--
Dott. Marco Di Sabatino Di Diodoro
Tel. +39 3939065570
Tirasa S.r.l.
Viale D'Annunzio 267 - 65127 Pescara
Tel +39 0859116307 / FAX +39 0859111173
http://www.tirasa.net <http://www.tirasa.net/>
Apache Syncope PMC Member
http://people.apache.org/~mdisabatino/