Perl Clients
From GridSiteWiki
This page contains notes on how to build a perl client for authenticated access to a GridSite. It splits into three section:
- How to get a web page using an X.509 client certificate as the authentication method
- How to get a web page using a GSI Proxy as the authentication method
- How to access a web service using SOAP::Lite, authenticating with your GSI Proxy (over TLS).
- Links to examples and applications of this.
Table of contents |
Perl to access GridSite over HTTPS using Standard X.509 Client Certificates
Notes on mutual authentication in perl using X.509 certs. How to interpret Client-SSL-Warning: Peer certificate not verified headers if you see them and even if you don't!
- First get and install Crypt::SSLeay if you haven't already got it.
perl -MCPAN -e 'install Crypt::SSLeay'
This provides the link between the https methods in LWP and the openssl C libraries.
During installation you will be prompted for an openssl to link against. (At first I linked against the stock openssl 0.9.7a and later discovered problems)... I ended up installing and linking against version 0.9.6m.
- Get an up to date version of the LWP (libwww) perl module.
The stock version that installs on a Fedora Core 1 is old and doesn't do everything needed for mutual authentication. These early versions of the LWP module produced the header "Client-SSL-Warning: Peer certificate not verified", regardless of the it was or not. So update the LWP module:
perl -MCPAN -e 'install "LWP"'
- Write a program to authenticate using your X.509 Certificate (one like this will do):
#!/usr/bin/perl use LWP::UserAgent; $ENV{HTTPS_CA_DIR} = (defined $ENV{X509_CERT_DIR})?$ENV{X509_CERT_DIR}:"/etc/grid-security/certificates"; $ENV{HTTPS_CERT_FILE} = $ENV{HOME}/.globus/usercert.pem; $ENV{HTTPS_KEY_FILE} = $ENV{HOME}/.globus/userkey.pem; # Print SSL Debug stuff (omit this line if not debugging) $ENV{HTTPS_DEBUG} = 1; # Instantiate an LWP User Agent to communicate through my $agent = LWP::UserAgent->new; # Get a response from https://www.gridsite.org/ my $response = $agent->get( "https://www.gridsite.org/" ); # Do something with your response if ( $response->is_success ) { print $response->as_string; } else { print "Something went wrong\n"; }
- To check that it's all working connect to a secure site that has a certificate issued by a CA not in $HTTPS_CA_DIR
Perl to access GridSite over HTTPS using GSI Proxies
- Write a new program e.g. this time, to authenticate with your GSI proxy.
#!/usr/bin/perl use LWP::UserAgent; $ENV{HTTPS_CA_DIR} = (defined $ENV{X509_CERT_DIR})?$ENV{X509_CERT_DIR}:"/etc/grid-security/certificates"; # ---- GSI Magic to make it work ---- my $GSIPROXY = (defined $ENV{X509_USER_PROXY})?$ENV{X509_USER_PROXY}:"/tmp/x509up_u$<"; $ENV{HTTPS_CA_FILE} = $GSIPROXY; $ENV{HTTPS_CERT_FILE} = $GSIPROXY; $ENV{HTTPS_KEY_FILE} = $GSIPROXY; # ---- End of GSI Magic ---- # Print SSL Debug stuff (omit this line if not debugging) $ENV{HTTPS_DEBUG} = 1; # Instantiate an LWP User Agent to communicate through my $agent = LWP::UserAgent->new; # Get a response from https://www.gridsite.org/ my $response = $agent->get( "https://www.gridsite.org/" ); # Do something with your response if ( $response->is_success ) { print $response->as_string; } else { print "Something went wrong\n"; }
- Anything that you use/build, which is derived from your instance of LWP, will use your proxy if you set the environment variables as specified above.
- HTTPS_KEY_FILE
- points to the file containtaining the key
- HTTPS_CERT_FILE
- points to the file containing the certificate that matches the key
- HTTPS_CA_FILE
- points to a file containing a list of trusted certificates (for GSI we specify this so that Crypt::SSLeay knows how to construct your GSI proxy's certificate chain)
- HTTPS_CA_DIR
- points to the directory containing all your Trusted CA Root Certificates
For GSI proxies the first three should be the same file (normally after a grid-proxy-init command located here: /tmp/x509up_u`id -u`).
SOAP::Lite to access GridSite over https using GSI Proxies
- Get SOAP::Lite if you haven't already got it.
perl -MCPAN -e 'install SOAP::Lite'
A Simple SOAP::Lite script might look a bit like this:
#!/usr/bin/perl # Uncomment next line for SOAP debug info # use SOAP::Lite +trace => debug => sub {}; use SOAP::Lite; # ---- GSI Magic to make it work ---- my $GSIPROXY = (defined $ENV{X509_USER_PROXY})?$ENV{X509_USER_PROXY}:"/tmp/x509up_u$<"; $ENV{HTTPS_CA_DIR} = (defined $ENV{X509_CERT_DIR})?$ENV{X509_CERT_DIR}:"/etc/grid-security/certificates"; $ENV{HTTPS_CA_FILE} = $GSIPROXY; $ENV{HTTPS_CERT_FILE} = $GSIPROXY; $ENV{HTTPS_KEY_FILE} = $GSIPROXY; # ---- End of GSI Magic ---- # Uncomment next line for SSL debug info # $ENV{HTTPS_DEBUG} = 1; # force SSLv3, If you want $ENV{HTTPS_VERSION} = '3'; # Instantiate a SOAP User Agent to communicate through (NB this need not be HTTPS, the WSDL will specify HTTP or HTTPS) $service = SOAP::Lite -> service( "http://www.gridsite.org/AnotherDescription.wsdl" ); # Call a WS Operation via the SOAP Agent $response = $service->SomeOperation(); print $response;
Perl Pearls
Assuming you've got to grips with the above stuff, you may like to visit the Perl Pearls (http://www.kato.mvc.mcc.ac.uk/gridsite/GridPerlPearls.html) page on the Manchester Computing RSS GridSite.
There in you'll find such gems as:
- How to create a legacy GSI proxy without any Globus code.
- How to create a basic yet secure and authenticated Application Hosting Environment.
- How to create a web service and client that will delegate a proxy to that hosting environment.
...