#!/usr/bin/perl #---------------------------------------------------------------------- # # printLdapCert.pl v: 20050601-01 # # Program to print a certificaty stored in LDAP directory # # Params: # # a = DN entry # h = LDAP server # p = port # # Example: # printLdapCert.pl?a=uid=masa,dc=rediris,dc=es&h=ldap.rediris.es&p=1389 # printLdapCert.pl?a=cn=henny,ou=Accounts,ou=Office,dc=SURFnet,dc=NL&h=alpha.surfnet.nl&p=389 # #---------------------------------------------------------------------- use Net::LDAP; use Net::LDAP::Search; use CGI::Lite; $cgi = new CGI::Lite; %webData = $cgi->parse_form_data; #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Ini: Configuracion / Config #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #-- LDAP data $ldapDef{'server'} = "ldap.rediris.es"; $ldapDef{'port'} = "1389"; $webStrings{'serverProblem'} = '"El servidor $wServer tiene un problema. No podemos contactar con él.
Server $wServer has a problem. We can contact it"'; $webStrings{'noParam'} = '"Se ha producido un error al llamar al script. No se ha introducido parametros al llamar al script. Revisa el codigo de la pagina Web
There is an error. You need to provide parameter a=DN"'; $cgi{'openssl'} = "/usr/local/bin/openssl"; $tempFile = "/tmp/kk1"; #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # End: Configuracion / Config #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # print Header print "Content-type: text/html\n\n"; if (defined $webData{a}) { $wBase = $webData{a}; $wServer = defined ($webData{h}) ? $webData{h} : $ldapDef{'server'}; $wPort = defined ($webData{p}) ? $webData{p} : $ldapDef{'port'}; $attr = "userCertificate"; $pLDAP = Net::LDAP->new ($wServer, port => $wPort, timeout => 10, async => 1,); if (defined $pLDAP){ $pLDAP->bind ( anonymous => 1, version => 3 ); $rdo = $pLDAP->search (base => $wBase, scope => "base", filter => "(c=tv)",); #-- Comprobamos si hay algun error como: # que el servidor tenga version 2 my $err = $rdo->error; if ($err ne "Success"){ $pLDAP->unbind; if ($err eq "Protocol Error"){ $pLDAP->bind ( anonymous => 1, version => 2 ); } else { print eval $webStrings{'serverProblem'}; } } # Obtenemos el atributo que nos interesa $rdo = $pLDAP->search (base => $wBase, scope => "base",filter => "(objectclass=*)", attrs => [ $attr ],); # Como es binario obtenemos el valor del atributo $der = ObtieneDER ($rdo->entry(0),$attr); # Lo meto en un archivo porque sino el openssl no lo entiende open REQUEST, ">$tempFile"; print REQUEST "$der"; close REQUEST; $wTitle = "Certificate for $wBase"; $wCert = `$cgi{'openssl'} x509 -inform DER -in $tempFile -text -noout`; $OUTPUT .= "

$wTitle

"; $OUTPUT .= "
$wCert
"; print $OUTPUT; unlink <$tempFile>; $pLDAP->unbind; } else { print eval $webStrings{'serverProblem'}; exit; } } # No me han metido los parametros requeridos else { print eval $webStrings{'noParam'}; exit; } #----------------------------------------------------------------------- # Funcion: ObtieneDER # Descrip: #----------------------------------------------------------------------- sub ObtieneDER{ local($entry,$attr)= @_; my $archivo; my @value = $entry->get_value( $attr.";binary" ); foreach my $value (@value) { $archivo = $archivo.$value; } return $archivo; }