Graham,

On Fri, Mar 13, 2015 at 3:39 PM, Graham Leggett <minf...@sharp.fm> wrote:

> Hi all,
>
> I have a basic authentication setup that works great as below.
>
>         <login-config>
>                 <auth-method>BASIC</auth-method>
>                 <realm-name>Patricia</realm-name>
>         </login-config>
>
>         <!-- Security roles referenced by this web application -->
>         <security-role>
>                 <role-name>administrator</role-name>
>         </security-role>
>         <security-role>
>                 <role-name>underwriter</role-name>
>         </security-role>
>         <security-role>
>                 <role-name>accountant</role-name>
>         </security-role>
>         <security-role>
>                 <role-name>broker</role-name>
>         </security-role>
>         <security-role>
>                 <role-name>feeds</role-name>
>         </security-role>
>
> It is backed up with a realm like this:
>
>           <Realm className=“org.apache.catalina.realm.DataSourceRealm"
>                  [snip]
>                  userTable="person" userNameCol="mail"
>                  userCredCol="user_password"
>                  userRoleTable="company_person" roleNameCol="serial" />
>
> I need to switch basic authentication to client certificates, as provided
> by Apache httpd and proxied in with AJP. The username is provided by Apache
> httpd in REMOTE_USER.
>
> In theory, changing the auth-method to CLIENT-CERT should do the trick,
> but I just get forbidden.
>
> What doesn’t seem to fit is the realm definition - specifying userCredCol
> is marked as mandatory, but this is obviously not present with a client
> certificate. What do you specify in this field?
>
> Does anyone have a working example of authentication using client
> certificates and authorization using a realm backed with a DataSource?
>

Here's a nice article, detailing how to add CLIENT-CERT:
http://java.dzone.com/articles/enabling-client-cert-based

It is based on MemoryRealm, not DataSourceRealm, but the idea is similar.

Here's a summary:

1. You need to define user/pass/roles:

<role rolename="secureconn"/>
<user username="CN=client1, OU=Application Development, O=GoSmarter,
L=Bangalore, ST=KA, C=IN" password="null"  roles="secureconn"/>

2. You define in web.xml the login type:
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>Demo App</realm-name>
</login-config>

You would get a 403 if an invalid certificate is sent based on the security
constraints you set earlier.

Ultimately, you need to turn on extra logging on that realm so you would
know why the 403s were generated.

Try doing some online searching for the type of errors you got. Here's what
pops up in my quick google search:
http://stackoverflow.com/questions/5086457/setting-up-client-cert-authentication-with-roles-on-tomcat-6-0

This person had an issue how CNs were handled, and as a result extra
inserted spaces between commas, e.g.
(1) no spaces: "CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU"
(2) with spaces: "CN=testuser, O=Internet Widgits Pty Ltd, ST=Some-State,
C=AU"

The issue was how X509Principal.getName() call returned:
X500Principal.RFC2253
X500Principal.RFC1779

Let us know what you find by turning on extra logging.

Cheers!
Neven

Reply via email to