Hello, Alex.

On Wednesday April 29, 2009 01:28:31 [email protected] wrote:
> i'm sorry i don't understand yet where to look in.
> in the request.environ i have the key paste.httpserver.threadpool that
> seems promising, but i don't see how to get to the server object yet.
>
> since you're the repoze man too, i'd need to find the server before the
> first request, in order to install a callback function in
> securehttpserver.ssl_context. this callback will do the repoze.who work.

No, you don't have to do anything of that. The solution is simpler.

You just need to authenticate the X.509 certificate based on some of its 
attributes, which should be available as items of the WSGI environ dictionary 
[1]. In this context, "authenticate" means check that the certificate is valid 
(against its CA's root certificate) and that it hasn't expired.

That plugin should look like this:
"""
from repoze.who.interfaces import IAuthenticator
from zope.interface import implements

class X509AuthenticatorPlugin(object):
    implements(IAuthenticator)

    def __init__(self, root_certs_of_cas):
        self.root_certs_of_cas = root_certs_of_cas

    def authenticate(self, environ, identity):
        cert_body = environ.get('SSL_CLIENT_CERT')
        if not cert_body:
            # There's no X.509 certificate to validate:
            return None
        
        ca = get_cert_ca(cert_body)
        if ca not in self.root_certs_of_cas:
            # We dont have the root certificate for this CA:
            return None

        this_ca = self.root_certs_of_cas[ca]
        if not validate_cert(this_ca, cert_body):
            # The certificate is invalid!
            return None

        if environ['SSL_CLIENT_V_END'] < now:
            # The certificate has expired
            return None

        # At this point, the cert is just perfect.
        return environ.get('SSL_CLIENT_S_DN')
"""

Cheers.

[1] Here's a sample vendor-specific list:
http://httpd.apache.org/docs/2.0/mod/mod_ssl.html#envvars
-- 
Gustavo Narea <xri://=Gustavo>.
| Tech blog: =Gustavo/(+blog)/tech  ~  About me: =Gustavo/about |

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/turbogears?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to