|
Tomasz Wlodek
tomw at bnl.gov
Fri Feb 3 17:18:18 EST 2006
Hello mod_python experts,
I would like to use mod_python to force Apache to authenticate users based
on their user certificate. I have encountered a problem: SSL environment
variables are not passed by Apache to mod_python authentication handler.
Here is how the whole thing should work.
In Apache conf files I tell it to load mod_ssl module
LoadModule ssl_module /usr/lib/httpd/modules/mod_ssl.so
then I turn the user verification option in SSL:
SSLEngine on
SSLCertificateFile /etc/...
SSLCertificateKeyFile /etc/...
SSLCACertificatePath /etc/....
SSLVerifyClient optional
SSLVerifyDepth 10
SSLOptions +ExportCertData +StdEnvVars
I restart Apache and I load a cgi script which dumps the available
environment variables. I can see that variables SSL_CLIENT_S_DN and
SSL_CLIENT_VERIFY variables are set or not set depending on whether I have
valid certificate in my browser or not. Halleluiah! The certificate based
authentication works in cgi scripts.
Now I would like to pass the work of deciding whether user was
authenticated or not from cgi script to mod_python authentication handler.
The idea is: mod_python authentication handler will check if the
SSL_CLIENT_S_DN variable was defined by SSL. If yes - return apache.OK. If
not return apache.HTTP_FORBIDDEN.
Sounds simple. So I set to work. I define mod-python authentication
handler:
<Directory /var/www/gridsite/cgi>
AddHandler mod_python .py
PythonHandler myhandler
PythonAuthenHandler myhandler
PythonDebug on
PythonPath "sys.path + ['/root/mod_python_handlers']"
AuthType Basic
AuthName "Restricted Area"
require valid-user
</Directory>
then I create the actual python handler in file
/root/mod_python_handlers/myhandler.py
from mod_python import apache
def authenhandler(req):
# let us make sure that environment variables are loaded
req.add_common_vars()
# we can dump the list of known environment variables, for debugging
#for line in req.subprocess_env.keys():
# req.write(line+"<br>\n")
# now comes the real work: if SSL verified the certificate, then
# SSL_CLIENT_S_DN variable should be set and the user can be approved
if req.subprocess_env.has_key('SSL_CLIENT_S_DN'):
return apache.OK
else:
return apache.HTTP_FORBIDDEN
That is all. Now I run the thing. It turns out that the SSL environment
variables are not visible from /root/mod_python_handlers/myhandler.py and
the handler always returns apache.HTTP_FORBIDDEN !
I can see those variables in the cgi scripts, but not in python
authentication handler.
Does anyone has an idea why? Do I need to call some function to load them?
If I modify the handler to be:
def authenhandler(req):
return apache.OK
so that everyone gets approved, and then display the content of
SSL_CLIENT_S_DN from cgi scripts then the variable is clearly there!
Tomasz Wlodek
|