2012/7/25 Amit <amit.khaw...@gmail.com>: > Michele, > > I have gone through the X509_Auth class and its methods : > > login_form > > login_url > get_user > > But not able to visualize how to use this class in my model/controller, I > just write below what I understood, please confirm > whether I understood correctly or not. > > > My requirement is : I have one web service method add() in controller > default.py , I just want to enable x509 authentication > so for that purpose i will use simpatica to generate keys and certificates > then in model class db.py I will use below code: > > > """ > Login using x509 cert from client. > > from gluon.contrib.login_methods.x509_auth import X509Account > auth.settings.actions_disabled=['register','change_password', > > 'request_reset_password','profile'] > auth.settings.login_form = X509Account() > > """ > > > and then in add method I will put @auth.requires_login() annotation . > > My doubt: > 1. how to configure certificate with Rocket and apache server? > 2. how to make call of web service method with private keys from the client? > > 3. I din't find X509Account class instead of that I found X509Auth class, so > is it the same, if yes then I need to create >
1 rocket: python web2py.py --ssl_certificate=<server pem encoded cert file> --ssl_private_key=<server pem encoded key file> --ca-cert=<CA certificate pem encoded file> apache see mod_ssl config: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html You can use a single file pem encoded containing: server cert, server key, CA cert. Pass it to all the options. 2 What is the client? With curl: curl --cert <client pem encoded cert + key file> ... With python: you can use pycurl or httplib (http://docs.python.org/library/httplib.html) see their docs. 3 You did the right thing using X509_Auth. The error in the comment is corrected in trunk. The interesting part that you may want to override in a child class is the get_user() method. Look how certificate properties are mapped to the auth.user record (the profile variable that). You may override those to fit your needs. mic > > auth.settings.login_form = X509Auth() instance ? > > > > Thanks, > Amit > > > > > > > > > > > > > > > > > On Wed, Jul 25, 2012 at 2:28 PM, Michele Comitini > <michele.comit...@gmail.com> wrote: >> >> ---- >> simpatica >> >> - generate ca priv key + self signed certificate >> - generate server priv keys + certificates signed by the above ca >> certificate >> - generate client priv keys + certificates signed by the above ca >> certificate >> >> The client and server certificate are generated after compilation of a >> form that requires the user to assign a password to protect the >> private key. >> The certificate + private keys are encoded in pkcs12 format >> downloadable to a browser or to be unpacked with openssl or similar >> tools after providing the above password. Remeber that if you loose >> the password you cannot open the pkcs12. There is a recovery >> mechanism in simpatica since the private keys are also encoded with a >> randomly generated secret that is crypted with the ca private key. >> It also send emails to email associated with the client informing that >> a certificate is ready to download. >> >> ----- >> Sample code >> >> Just look at gluon/contrib/login_methods/x509_auth.py. Look at the >> docstring in the X509_Auth class and put that code in your model to >> configure authentication with x509. >> >> Use the @auth.requires_login() annotation as you would with any action >> requiring authentication. It is explained in: >> >> http://web2py.com/books/default/chapter/29/10?search=rest#Access-Control >> >> >> mic >> >> >> 2012/7/25 Amit <amit.khaw...@gmail.com>: >> > sure Michele, let me go through the code,If i am not wrong simpatica is >> > to >> > generate the certificate file for the client and if you are having any >> > sample code to use x509 in case of web service then please do share with >> > me. >> > >> > Thanks, >> > Amit >> > >> > >> > On Wed, Jul 25, 2012 at 12:34 PM, Michele Comitini >> > <michele.comit...@gmail.com> wrote: >> >> >> >> Amit >> >> If you need advice with simpatica don't worry to ask. I never had time >> >> to >> >> write some documentation so you have to look at the code and/or ask... >> >> >> >> mic >> >> >> >> >> >> Il giorno mercoledì 25 luglio 2012 05:14:52 UTC+2, Amit ha scritto: >> >>> >> >>> Thanks Michele and Derek..nice post , i am looking exactly the same :) >> >>> >> >>> On Wed, Jul 25, 2012 at 4:09 AM, Michele Comitini >> >>> <michele.comit...@gmail.com> wrote: >> >>>> >> >>>> >> >>>> This is very similar to what TSL accomplishes with x509 certificates. >> >>>> There is a slight difference, the server does not own a public key >> >>>> for each >> >>>> client: it verifies that the client owns an x509 certificate signed >> >>>> by the >> >>>> correct certification authority. So no need to store public keys. in >> >>>> any >> >>>> case AFAIK in public/private key algorithms the private key always >> >>>> allows >> >>>> generation of the corresponding public key, not the contrary of >> >>>> course. >> >>>> >> >>>> To accomplish what you need in the simplest way you have to: >> >>>> >> >>>> - create a certification authority with self signed certificate >> >>>> - create certificate for you webserver signed with the private key of >> >>>> the certification authority above. >> >>>> - configure your webserver to require a client certificate (with >> >>>> rocket >> >>>> look at --ca-cert option) >> >>>> - In case you need to know some infos about the connecting client as >> >>>> reported in its certificate you can use x509_auth.py to use x509 >> >>>> authentication and configure your REST action with >> >>>> @auth.requires_login(). >> >>>> This will give you access to information contained in the >> >>>> certificate such >> >>>> common name or serial id. To customize you can extend the X509_Auth >> >>>> class. >> >>>> >> >>>> To generate test certificates fast you can use simpatica as Derek >> >>>> correctly suggests. >> >>>> >> >>>> mic >> >>>> >> >>>> Il giorno martedì 24 luglio 2012 10:33:48 UTC+2, Amit ha scritto: >> >>>>> >> >>>>> Hi, >> >>>>> I have to provide public/private key authentication for accessing >> >>>>> web >> >>>>> service (REST) from client in my web2py application.How to achieve >> >>>>> it? >> >>>>> >> >>>>> Scenario: >> >>>>> 1.Each client will have unique private key which will be sent to the >> >>>>> server alongwith request. >> >>>>> 2. Server has to authenticate private key using public key(unique >> >>>>> for >> >>>>> each client) and then allow to access the web service method. For >> >>>>> e.g. >> >>>>> suppose one client say X has requested for web service "add()" so >> >>>>> server has >> >>>>> to first validate the public key with client's private key and if >> >>>>> validation >> >>>>> is successful then allow to access the web service "add()". >> >>>>> >> >>>>> Challenges: >> >>>>> where to store public key of each client?we can't store it in the db >> >>>>> because server can't access db before validation of web service >> >>>>> method.So >> >>>>> will it be store somewhere in PC(where server is running)?if yes >> >>>>> then how >> >>>>> and which format? >> >>>>> >> >>>>> >> >>>>> NOTE: Here Server will be completely written in web2py and client is >> >>>>> separate application running on the hardware device. >> >>>>> >> >>>> -- >> >>>> >> >>>> >> >>>> >> >>> >> >>> >> >> -- >> >> >> >> >> >> >> > >> > >> > -- >> > >> > >> > >> >> -- >> >> >> > > -- > > > --